library(tidyverse)
library(gridExtra)

Attaching package: ‘gridExtra’

The following object is masked from ‘package:dplyr’:

    combine
library(cowplot)

********************************************************
Note: As of version 1.0.0, cowplot does not change the
  default ggplot2 theme anymore. To recover the previous
  behavior, execute:
  theme_set(theme_cowplot())
********************************************************

Add Batch ID to Wet Weight Dataframes

# add batch id variable to each dataset
## Set 1
### Wet Shoot
set_1_WS_id <- set_1_WS
set_1_WS_id$batch <- c("Set 1")
### Wet Root
set_1_WR_id <- set_1_WR
set_1_WR_id$batch <- c("Set 1")
## Set 2.1
### Wet Shoot
set_2.1_WS_id <- set_2.1_WS
set_2.1_WS_id$batch <- c("Set 2.1")
### Wet Root
set_2.1_WR_id <- set_2.1_WR
set_2.1_WR_id$batch <- c("Set 2.1")
## Set 2.2
### Wet Shoot
set_2.2_WS_id <- set_2.2_WS
set_2.2_WS_id$batch <- c("Set 2.2")
### Wet Root
set_2.2_WR_id <- set_2.2_WR
set_2.2_WR_id$batch <- c("Set 2.2")
## Set 2.3
### Wet Shoot
set_2.3_WS_id <- set_2.3_WS
set_2.3_WS_id$batch <- c("Set 2.3")
### Wet Root
set_2.3_WR_id <- set_2.3_WR
set_2.3_WR_id$batch <- c("Set 2.3")
## Set 2.4
### Wet Shoot
set_2.4_WS_id <- set_2.4_WS
set_2.4_WS_id$batch <- c("Set 2.4")
### Wet Root
set_2.4_WR_id <- set_2.4_WR
set_2.4_WR_id$batch <- c("Set 2.4")
## Set 3.1
### Wet Shoot
set_3.1_WS_id <- set_3.1_WS
set_3.1_WS_id$batch <- c("Set 3.1")
### Wet Root
set_3.1_WR_id <- set_3.1_WR
set_3.1_WR_id$batch <- c("Set 3.1")
## Set 3.2
### Wet Shoot
set_3.2_WS_id <- set_3.2_WS
set_3.2_WS_id$batch <- c("Set 3.2")
### Wet Root
set_3.2_WR_id <- set_3.2_WR
set_3.2_WR_id$batch <- c("Set 3.2")
## Set 3.3
### Wet Shoot
set_3.3_WS_id <- set_3.3_WS
set_3.3_WS_id$batch <- c("Set 3.3")
### Wet Root
set_3.3_WR_id <- set_3.3_WR
set_3.3_WR_id$batch <- c("Set 3.3")
## Set 3.4
### Wet Shoot
set_3.4_WS_id <- set_3.4_WS
set_3.4_WS_id$batch <- c("Set 3.4")
### Wet Root
set_3.4_WR_id <- set_3.4_WR
set_3.4_WR_id$batch <- c("Set 3.4")
## Set 3.5
### Wet Shoot
set_3.5_WS_id <- set_3.5_WS
set_3.5_WS_id$batch <- c("Set 3.5")
### Wet Root
set_3.5_WR_id <- set_3.5_WR
set_3.5_WR_id$batch <- c("Set 3.5")
## Set 4.1
### Wet Shoot
set_4.1_WS_id <- set_4.1_WS
set_4.1_WS_id$batch <- c("Set 4.1")
### Wet Root
set_4.1_WR_id <- set_4.1_WR
set_4.1_WR_id$batch <- c("Set 4.1")
## Set 4.2
### Wet Shoot
set_4.2_WS_id <- set_4.2_WS
set_4.2_WS_id$batch <- c("Set 4.2")
### Wet Root
set_4.2_WR_id <- set_4.2_WR
set_4.2_WR_id$batch <- c("Set 4.2")
## Set 4.3
### Wet Shoot
set_4.3_WS_id <- set_4.3_WS
set_4.3_WS_id$batch <- c("Set 4.3")
### Wet Root
set_4.3_WR_id <- set_4.3_WR
set_4.3_WR_id$batch <- c("Set 4.3")

Group the Data for Plotting

#Group the datasets based on Sample ID and prep method
## Set 1
set_1_WS_grouped <- group_by(set_1_WS_id, isolate, sample, batch)
set_1_WR_grouped <- group_by(set_1_WR_id, isolate, sample, batch)
## Set 2.1
set_2.1_WS_grouped <- group_by(set_2.1_WS_id, isolate, sample, batch)
set_2.1_WR_grouped <- group_by(set_2.1_WR_id, isolate, sample, batch)
## Set 2.2
set_2.2_WS_grouped <- group_by(set_2.2_WS_id, isolate, sample, batch)
set_2.2_WR_grouped <- group_by(set_2.2_WR_id, isolate, sample, batch)
## Set 2.3
set_2.3_WS_grouped <- group_by(set_2.3_WS_id, isolate, sample, batch)
set_2.3_WR_grouped <- group_by(set_2.3_WR_id, isolate, sample, batch)
## Set 2.4
set_2.4_WS_grouped <- group_by(set_2.4_WS_id, isolate, sample, batch)
set_2.4_WR_grouped <- group_by(set_2.4_WR_id, isolate, sample, batch)
## Set 3.1
set_3.1_WS_grouped <- group_by(set_3.1_WS_id, isolate, sample, batch)
set_3.1_WR_grouped <- group_by(set_3.1_WR_id, isolate, sample, batch)
## Set 3.2
set_3.2_WS_grouped <- group_by(set_3.2_WS_id, isolate, sample, batch)
set_3.2_WR_grouped <- group_by(set_3.2_WR_id, isolate, sample, batch)
## Set 3.3
set_3.3_WS_grouped <- group_by(set_3.3_WS_id, isolate, sample, batch)
set_3.3_WR_grouped <- group_by(set_3.3_WR_id, isolate, sample, batch)
## Set 3.4
set_3.4_WS_grouped <- group_by(set_3.4_WS_id, isolate, sample, batch)
set_3.4_WR_grouped <- group_by(set_3.4_WR_id, isolate, sample, batch)
## Set 3.5
set_3.5_WS_grouped <- group_by(set_3.5_WS_id, isolate, sample, batch)
set_3.5_WR_grouped <- group_by(set_3.5_WR_id, isolate, sample, batch)
## Set 4.1
set_4.1_WS_grouped <- group_by(set_4.1_WS_id, isolate, sample, batch)
set_4.1_WR_grouped <- group_by(set_4.1_WR_id, isolate, sample, batch)
## Set 4.2
set_4.2_WS_grouped <- group_by(set_4.2_WS_id, isolate, sample, batch)
set_4.2_WR_grouped <- group_by(set_4.2_WR_id, isolate, sample, batch)
## Set 4.3
set_4.3_WS_grouped <- group_by(set_4.3_WS_id, isolate, sample, batch)
set_4.3_WR_grouped <- group_by(set_4.3_WR_id, isolate, sample, batch)

Create Stats Functions

# Creating a function that provides 95% CI for the data vector using a t-distribution
conf_int95 <- function(data) {
    n <- length(data)
    error <- qt(0.975, df=n-1) * sd(data, na.rm = TRUE)/sqrt(n)
    return(error)
}
# Create a function that calculates the standard error for the data
std_error <- function(data) {
  n <- length(data)
  se <- sd(data, na.rm = TRUE)/sqrt(n)
  return(se)
}

Compute stats over triplicates for plotting

# set 1
stat_set_1_WS <- summarise(set_1_WS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_1_WR <- summarise(set_1_WR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 2.1
stat_set_2.1_WS <- summarise(set_2.1_WS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_2.1_WR <- summarise(set_2.1_WR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 2.2
stat_set_2.2_WS <- summarise(set_2.2_WS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_2.2_WR <- summarise(set_2.2_WR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 2.3
stat_set_2.3_WS <- summarise(set_2.3_WS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_2.3_WR <- summarise(set_2.3_WR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 2.4
stat_set_2.4_WS <- summarise(set_2.4_WS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_2.4_WR <- summarise(set_2.4_WR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 3.1
stat_set_3.1_WS <- summarise(set_3.1_WS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_3.1_WR <- summarise(set_3.1_WR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 3.2
stat_set_3.2_WS <- summarise(set_3.2_WS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_3.2_WR <- summarise(set_3.2_WR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 3.3
stat_set_3.3_WS <- summarise(set_3.3_WS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_3.3_WR <- summarise(set_3.3_WR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 3.4
stat_set_3.4_WS <- summarise(set_3.4_WS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_3.4_WR <- summarise(set_3.4_WR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 3.5
stat_set_3.5_WS <- summarise(set_3.5_WS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_3.5_WR <- summarise(set_3.5_WR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 4.1
stat_set_4.1_WS <- summarise(set_4.1_WS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_4.1_WR <- summarise(set_4.1_WR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 4.2
stat_set_4.2_WS <- summarise(set_4.2_WS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_4.2_WR <- summarise(set_4.2_WR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 4.3
stat_set_4.3_WS <- summarise(set_4.3_WS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_4.3_WR <- summarise(set_4.3_WR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))

Wet Weight Plots

Set 1

Wet Shoot

With NAs
# ggplot with bars
## set the control value for Wet Shoot mg
## remove control-WO
stat_set_1_WS_NAs <- filter(stat_set_1_WS, isolate != "control-WO")
set_1_WS_control_int <- as.numeric(stat_set_1_WS[58,5])
#set_1_WS_control_int
set_1_WS_bars_NA <- ggplot(stat_set_1_WS_NAs, aes(x = isolate, y = Average))
set_1_WS_bars_NA <- set_1_WS_bars_NA + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_1_WS_bars_NA <- set_1_WS_bars_NA + geom_hline(yintercept=set_1_WS_control_int, colour="#990000", linetype="dashed")
set_1_WS_bars_NA <- set_1_WS_bars_NA + labs(x="", y="Shoot - Fresh Weight (mg)")
set_1_WS_bars_NA <- set_1_WS_bars_NA + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_1_WS_bars_NA <- set_1_WS_bars_NA + theme(axis.text.x = element_text(angle = 75, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_1_WS_bars_NA <- set_1_WS_bars_NA + scale_x_discrete(position = "bottom", expand = c(0,0))
set_1_WS_bars_NA <- set_1_WS_bars_NA + scale_y_continuous(expand = c(0,0))
set_1_WS_bars_NA <- set_1_WS_bars_NA + geom_text(aes(x=1, y=650, label="Stretch it"), vjust=-1)
set_1_WS_bars_NA

Removed NAs
# ggplot with bars
## remove isoaltes with NA values
stat_s1_WS_complete <- stat_set_1_WS[complete.cases(stat_set_1_WS),]
## remove control-WO
stat_s1_WS_complete <- filter(stat_s1_WS_complete, isolate != "control-WO")
## set the control value for Wet Shoot mg
set_1_WS_control_int <- as.numeric(stat_s1_WS_complete[39,5])
## calculate % control for each treatment
stat_s1_WS_complete$control <- as.numeric(stat_s1_WS_complete[39,5])
stat_s1_WS_complete <- mutate(stat_s1_WS_complete, p_ctrl = (100* (Average / control)))
## Make the plot
set_1_WS_bars <- ggplot(stat_s1_WS_complete, aes(x = isolate, y = Average))
set_1_WS_bars <- set_1_WS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_1_WS_bars <- set_1_WS_bars + geom_hline(aes(yintercept=set_1_WS_control_int), colour="#990000", linetype="dashed")
set_1_WS_bars <- set_1_WS_bars + labs(x="", y="Shoot - Fresh Weight (mg)")
set_1_WS_bars <- set_1_WS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
#set_1_WS_bars <- set_1_WS_bars + geom_text(aes(label=sprintf("%0.0f", round(p_ctrl, digits = 0)), y=Average+SE, vjust=-0.5), hjust = 0, angle = 45)
set_1_WS_bars <- set_1_WS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_1_WS_bars <- set_1_WS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_1_WS_bars <- set_1_WS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,700))
set_1_WS_bars <- set_1_WS_bars + geom_text(aes(x=isolate[24], y=640, label="205%"), hjust=0.38)
set_1_WS_bars <- set_1_WS_bars + geom_text(aes(x=isolate[11], y=600, label="187%"), hjust=0.38)
set_1_WS_bars

Wet Root

With NAs
# ggplot with bars
## remove control-WO
stat_set_1_WR_NAs <- filter(stat_set_1_WR, isolate != "control-WO")
## set the control value for Wet Root mg
set_1_WR_control_int <- as.numeric(stat_set_1_WR[58,5])
set_1_WR_bars_NA <- ggplot(stat_set_1_WR_NAs, aes(x = isolate, y = Average))
set_1_WR_bars_NA <- set_1_WR_bars_NA + geom_bar(stat = "identity", size=.5, fill="tan")
set_1_WR_bars_NA <- set_1_WR_bars_NA + geom_hline(aes(yintercept=set_1_WR_control_int), colour="#990000", linetype="dashed")
set_1_WR_bars_NA <- set_1_WR_bars_NA + labs(x="", y="Root - Fresh Weight (mg)")
set_1_WR_bars_NA <- set_1_WR_bars_NA + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_1_WR_bars_NA <- set_1_WR_bars_NA + theme(axis.text.x = element_text(angle = 75, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_1_WR_bars_NA <- set_1_WR_bars_NA + scale_x_discrete(position = "bottom", expand = c(0,0))
set_1_WR_bars_NA <- set_1_WR_bars_NA + scale_y_continuous(expand = c(0,0))
set_1_WR_bars_NA

Removed NAs
# ggplot with bars
## remove isoaltes with NA values
stat_s1_WR_complete <- stat_set_1_WR[complete.cases(stat_set_1_WR),]
## remove control-WO
stat_s1_WR_complete <- filter(stat_s1_WR_complete, isolate != "control-WO")
## set the control value for Wet Root mg
set_1_WR_control_int <- as.numeric(stat_s1_WR_complete[39,5])
## calculate % control for each treatment
stat_s1_WR_complete$control <- as.numeric(stat_s1_WR_complete[39,5])
stat_s1_WR_complete <- mutate(stat_s1_WR_complete, p_ctrl = (100* (Average / control)))
## Plot
set_1_WR_bars <- ggplot(stat_s1_WR_complete, aes(x = isolate, y = Average))
set_1_WR_bars <- set_1_WR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_1_WR_bars <- set_1_WR_bars + geom_hline(aes(yintercept=set_1_WR_control_int), colour="#990000", linetype="dashed")
set_1_WR_bars <- set_1_WR_bars + labs(x="", y="Root - Fresh Weight (mg)")
set_1_WR_bars <- set_1_WR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_1_WR_bars <- set_1_WR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_1_WR_bars <- set_1_WR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_1_WR_bars <- set_1_WR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,220))
set_1_WR_bars <- set_1_WR_bars + geom_text(aes(x=isolate[6], y=210, label="258%"), hjust=0.38)
set_1_WR_bars <- set_1_WR_bars + geom_text(aes(x=isolate[5], y=165, label="253%"), hjust=0.44)
set_1_WR_bars <- set_1_WR_bars + geom_text(aes(x=isolate[2], y=150, label="220%"), hjust=0.38)
set_1_WR_bars

Cowplot - Set 1 - NA’s Removed
set_1_wet_grid <- plot_grid(set_1_WS_bars + 
                                theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_1_WR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("A", "B"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_1_wet_grid

ggsave("./Plots/set_1_wet_grid.pdf", set_1_wet_grid, width = 16, height = 16)
Cowplot - Set 1 - With NA’s
set_1_wet_grid_NAs <- plot_grid(set_1_WS_bars_NA + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_1_WR_bars_NA + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("A", "B"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            #vjust = 3,
                            align = 'vh')
Removed 12 rows containing missing values (position_stack).Removed 12 rows containing missing values (position_stack).
set_1_wet_grid_NAs

ggsave("./Plots/set_1_wet_grid_NAs.pdf", set_1_wet_grid_NAs, width = 16, height = 16)

Set 2.1

Wet Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s2.1_WS_complete <- stat_set_2.1_WS[complete.cases(stat_set_2.1_WS),]
## set the control value for Wet Shoot mg
set_2.1_WS_control_int <- as.numeric(stat_s2.1_WS_complete[31,5])
## calculate % control for each treatment
stat_s2.1_WS_complete$control <- as.numeric(stat_s2.1_WS_complete[31,5])
stat_s2.1_WS_complete <- mutate(stat_s2.1_WS_complete, p_ctrl = (100* (Average / control)))
set_2.1_WS_bars <- ggplot(stat_s2.1_WS_complete, aes(x = isolate, y = Average))
set_2.1_WS_bars <- set_2.1_WS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_2.1_WS_bars <- set_2.1_WS_bars + geom_hline(aes(yintercept=set_2.1_WS_control_int), colour="#990000", linetype="dashed")
set_2.1_WS_bars <- set_2.1_WS_bars + labs(x="", y="Shoot - Fresh Weight (mg)")
set_2.1_WS_bars <- set_2.1_WS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_2.1_WS_bars <- set_2.1_WS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.1_WS_bars <- set_2.1_WS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.1_WS_bars <- set_2.1_WS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,700))
set_2.1_WS_bars <- set_2.1_WS_bars + geom_text(aes(x=isolate[12], y=590, label="301%"), hjust=0.38)
set_2.1_WS_bars

Wet Root

# ggplot with bars
## remove isoaltes with NA values
stat_s2.1_WR_complete <- stat_set_2.1_WR[complete.cases(stat_set_2.1_WR),]
## set the control value for Wet Root mg
set_2.1_WR_control_int <- as.numeric(stat_s2.1_WR_complete[31,5])
## calculate % control for each treatment
stat_s2.1_WR_complete$control <- as.numeric(stat_s2.1_WR_complete[31,5])
stat_s2.1_WR_complete <- mutate(stat_s2.1_WR_complete, p_ctrl = (100* (Average / control)))
set_2.1_WR_bars <- ggplot(stat_s2.1_WR_complete, aes(x = isolate, y = Average))
set_2.1_WR_bars <- set_2.1_WR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_2.1_WR_bars <- set_2.1_WR_bars + geom_hline(aes(yintercept=set_2.1_WR_control_int), colour="#990000", linetype="dashed")
set_2.1_WR_bars <- set_2.1_WR_bars + labs(x="", y="Root - Fresh Weight (mg)")
set_2.1_WR_bars <- set_2.1_WR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_2.1_WR_bars <- set_2.1_WR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.1_WR_bars <- set_2.1_WR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.1_WR_bars <- set_2.1_WR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,180))
set_2.1_WR_bars <- set_2.1_WR_bars + geom_text(aes(x=isolate[24], y=138, label="288%"), hjust=0.38)
set_2.1_WR_bars <- set_2.1_WR_bars + geom_text(aes(x=isolate[21], y=136, label="274%"), hjust=0.44)
set_2.1_WR_bars <- set_2.1_WR_bars + geom_text(aes(x=isolate[18], y=125, label="265%"), hjust=0.38)
set_2.1_WR_bars <- set_2.1_WR_bars + geom_text(aes(x=isolate[12], y=139.5, label="262%"), hjust=0.38)
set_2.1_WR_bars

Cowplot - Set 2.1

set_2.1_wet_grid <- plot_grid(set_2.1_WS_bars + 
                                theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_2.1_WR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("A", "B"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_2.1_wet_grid

ggsave("./Plots/set_2.1_wet_grid.pdf", set_2.1_wet_grid, width = 16, height = 16)

Set 2.2

Wet Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s2.2_WS_complete <- stat_set_2.2_WS[complete.cases(stat_set_2.2_WS),]
## set the control value for Wet Shoot mg
set_2.2_WS_control_int <- as.numeric(stat_s2.2_WS_complete[32,5])
## calculate % control for each treatment
stat_s2.2_WS_complete$control <- as.numeric(stat_s2.2_WS_complete[32,5])
stat_s2.2_WS_complete <- mutate(stat_s2.2_WS_complete, p_ctrl = (100* (Average / control)))
set_2.2_WS_bars <- ggplot(stat_s2.2_WS_complete, aes(x = isolate, y = Average))
set_2.2_WS_bars <- set_2.2_WS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_2.2_WS_bars <- set_2.2_WS_bars + geom_hline(aes(yintercept=set_2.2_WS_control_int), colour="#990000", linetype="dashed")
set_2.2_WS_bars <- set_2.2_WS_bars + labs(x="", y="Shoot - Fresh Weight (mg)")
set_2.2_WS_bars <- set_2.2_WS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_2.2_WS_bars <- set_2.2_WS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.2_WS_bars <- set_2.2_WS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.2_WS_bars <- set_2.2_WS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,990))
set_2.2_WS_bars <- set_2.2_WS_bars + geom_text(aes(x=isolate[26], y=945, label="285%"), hjust=0.38)
set_2.2_WS_bars

Wet Root

# ggplot with bars
## remove isoaltes with NA values
stat_s2.2_WR_complete <- stat_set_2.2_WR[complete.cases(stat_set_2.2_WR),]
## set the control value for Wet Root mg
set_2.2_WR_control_int <- as.numeric(stat_s2.2_WR_complete[32,5])
## calculate % control for each treatment
stat_s2.2_WR_complete$control <- as.numeric(stat_s2.2_WR_complete[32,5])
stat_s2.2_WR_complete <- mutate(stat_s2.2_WR_complete, p_ctrl = (100* (Average / control)))
set_2.2_WR_bars <- ggplot(stat_s2.2_WR_complete, aes(x = isolate, y = Average))
set_2.2_WR_bars <- set_2.2_WR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_2.2_WR_bars <- set_2.2_WR_bars + geom_hline(aes(yintercept=set_2.2_WR_control_int), colour="#990000", linetype="dashed")
set_2.2_WR_bars <- set_2.2_WR_bars + labs(x="", y="Root - Fresh Weight (mg)")
set_2.2_WR_bars <- set_2.2_WR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_2.2_WR_bars <- set_2.2_WR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.2_WR_bars <- set_2.2_WR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.2_WR_bars <- set_2.2_WR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,180))
set_2.2_WR_bars <- set_2.2_WR_bars + geom_text(aes(x=isolate[26], y=170, label="226%"), hjust=0.38)
set_2.2_WR_bars

Cowplot - Set 2.2

set_2.2_wet_grid <- plot_grid(set_2.2_WS_bars + 
                                theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_2.2_WR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("A", "B"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_2.2_wet_grid

ggsave("./Plots/set_2.2_wet_grid.pdf", set_2.2_wet_grid, width = 16, height = 16)

Set 2.3

Wet Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s2.3_WS_complete <- stat_set_2.3_WS[complete.cases(stat_set_2.3_WS),]
## set the control value for Wet Shoot mg
set_2.3_WS_control_int <- as.numeric(stat_s2.3_WS_complete[25,5])
## calculate % control for each treatment
stat_s2.3_WS_complete$control <- as.numeric(stat_s2.3_WS_complete[25,5])
stat_s2.3_WS_complete <- mutate(stat_s2.3_WS_complete, p_ctrl = (100* (Average / control)))
set_2.3_WS_bars <- ggplot(stat_s2.3_WS_complete, aes(x = isolate, y = Average))
set_2.3_WS_bars <- set_2.3_WS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_2.3_WS_bars <- set_2.3_WS_bars + geom_hline(aes(yintercept=set_2.3_WS_control_int), colour="#990000", linetype="dashed")
set_2.3_WS_bars <- set_2.3_WS_bars + labs(x="", y="Shoot - Fresh Weight (mg)")
set_2.3_WS_bars <- set_2.3_WS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_2.3_WS_bars <- set_2.3_WS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.3_WS_bars <- set_2.3_WS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.3_WS_bars <- set_2.3_WS_bars + scale_y_continuous(expand = c(0,0))
set_2.3_WS_bars <- set_2.3_WS_bars + geom_text(aes(x=1, y=650, label="Stretch it"), vjust=-1)
set_2.3_WS_bars

Wet Root

# ggplot with bars
## remove isoaltes with NA values
stat_s2.3_WR_complete <- stat_set_2.3_WR[complete.cases(stat_set_2.3_WR),]
## set the control value for Wet Root mg
set_2.3_WR_control_int <- as.numeric(stat_s2.3_WR_complete[25,5])
## calculate % control for each treatment
stat_s2.3_WR_complete$control <- as.numeric(stat_s2.3_WR_complete[25,5])
stat_s2.3_WR_complete <- mutate(stat_s2.3_WR_complete, p_ctrl = (100* (Average / control)))
set_2.3_WR_bars <- ggplot(stat_s2.3_WR_complete, aes(x = isolate, y = Average))
set_2.3_WR_bars <- set_2.3_WR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_2.3_WR_bars <- set_2.3_WR_bars + geom_hline(aes(yintercept=set_2.3_WR_control_int), colour="#990000", linetype="dashed")
set_2.3_WR_bars <- set_2.3_WR_bars + labs(x="", y="Root - Fresh Weight (mg)")
set_2.3_WR_bars <- set_2.3_WR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_2.3_WR_bars <- set_2.3_WR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.3_WR_bars <- set_2.3_WR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.3_WR_bars <- set_2.3_WR_bars + scale_y_continuous(expand = c(0,0))
set_2.3_WR_bars <- set_2.3_WR_bars + geom_text(aes(x=1, y=195, label=""), vjust=-1)
set_2.3_WR_bars

Cowplot - Set 2.3

set_2.3_wet_grid <- plot_grid(set_2.3_WS_bars + 
                                theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_2.3_WR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("A", "B"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_2.3_wet_grid

ggsave("./Plots/set_2.3_wet_grid.pdf", set_2.3_wet_grid, width = 16, height = 16)

Set 2.4

Wet Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s2.4_WS_complete <- stat_set_2.4_WS[complete.cases(stat_set_2.4_WS),]
## set the control value for Wet Shoot mg
set_2.4_WS_control_int <- as.numeric(stat_s2.4_WS_complete[36,5])
## calculate % control for each treatment
stat_s2.4_WS_complete$control <- as.numeric(stat_s2.4_WS_complete[36,5])
stat_s2.4_WS_complete <- mutate(stat_s2.4_WS_complete, p_ctrl = (100* (Average / control)))
set_2.4_WS_bars <- ggplot(stat_s2.4_WS_complete, aes(x = isolate, y = Average))
set_2.4_WS_bars <- set_2.4_WS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_2.4_WS_bars <- set_2.4_WS_bars + geom_hline(aes(yintercept=set_2.4_WS_control_int), colour="#990000", linetype="dashed")
set_2.4_WS_bars <- set_2.4_WS_bars + labs(x="", y="Shoot - Fresh Weight (mg)")
set_2.4_WS_bars <- set_2.4_WS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_2.4_WS_bars <- set_2.4_WS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.4_WS_bars <- set_2.4_WS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.4_WS_bars <- set_2.4_WS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,775))
set_2.4_WS_bars <- set_2.4_WS_bars + geom_text(aes(x=isolate[34], y=735, label="256%"), hjust=0.38)
set_2.4_WS_bars <- set_2.4_WS_bars + geom_text(aes(x=isolate[25], y=636, label="197%"), hjust=0.38)
set_2.4_WS_bars

Wet Root

# ggplot with bars
## remove isoaltes with NA values
stat_s2.4_WR_complete <- stat_set_2.4_WR[complete.cases(stat_set_2.4_WR),]
## set the control value for Wet Root mg
set_2.4_WR_control_int <- as.numeric(stat_s2.4_WR_complete[36,5])
## calculate % control for each treatment
stat_s2.4_WR_complete$control <- as.numeric(stat_s2.4_WR_complete[36,5])
stat_s2.4_WR_complete <- mutate(stat_s2.4_WR_complete, p_ctrl = (100* (Average / control)))
set_2.4_WR_bars <- ggplot(stat_s2.4_WR_complete, aes(x = isolate, y = Average))
set_2.4_WR_bars <- set_2.4_WR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_2.4_WR_bars <- set_2.4_WR_bars + geom_hline(aes(yintercept=set_2.4_WR_control_int), colour="#990000", linetype="dashed")
set_2.4_WR_bars <- set_2.4_WR_bars + labs(x="", y="Root - Fresh Weight (mg)")
set_2.4_WR_bars <- set_2.4_WR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_2.4_WR_bars <- set_2.4_WR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.4_WR_bars <- set_2.4_WR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.4_WR_bars <- set_2.4_WR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,175))
set_2.4_WR_bars <- set_2.4_WR_bars + geom_text(aes(x=isolate[34], y=165, label="293%"), hjust=0.38)
set_2.4_WR_bars

Cowplot - Set 2.4

set_2.4_wet_grid <- plot_grid(set_2.4_WS_bars + 
                                theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_2.4_WR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("A", "B"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_2.4_wet_grid

ggsave("./Plots/set_2.4_wet_grid.pdf", set_2.4_wet_grid, width = 16, height = 16)

Set 3.1

Wet Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s3.1_WS_complete <- stat_set_3.1_WS[complete.cases(stat_set_3.1_WS),]
## set the control value for Wet Shoot mg
set_3.1_WS_control_int <- as.numeric(stat_s3.1_WS_complete[36,5])
## calculate % control for each treatment
stat_s3.1_WS_complete$control <- as.numeric(stat_s3.1_WS_complete[36,5])
stat_s3.1_WS_complete <- mutate(stat_s3.1_WS_complete, p_ctrl = (100* (Average / control)))
set_3.1_WS_bars <- ggplot(stat_s3.1_WS_complete, aes(x = isolate, y = Average))
set_3.1_WS_bars <- set_3.1_WS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_3.1_WS_bars <- set_3.1_WS_bars + geom_hline(aes(yintercept=set_3.1_WS_control_int), colour="#990000", linetype="dashed")
set_3.1_WS_bars <- set_3.1_WS_bars + labs(x="", y="Shoot - Fresh Weight (mg)")
set_3.1_WS_bars <- set_3.1_WS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.1_WS_bars <- set_3.1_WS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.1_WS_bars <- set_3.1_WS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.1_WS_bars <- set_3.1_WS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,900))
set_3.1_WS_bars <- set_3.1_WS_bars + geom_text(aes(x=isolate[18], y=814, label="233%"), hjust=0.38)
set_3.1_WS_bars <- set_3.1_WS_bars + geom_text(aes(x=isolate[33], y=564, label="223%"), hjust=0.38)
set_3.1_WS_bars

Wet Root

# ggplot with bars
## remove isoaltes with NA values
stat_s3.1_WR_complete <- stat_set_3.1_WR[complete.cases(stat_set_3.1_WR),]
## set the control value for Wet Root mg
set_3.1_WR_control_int <- as.numeric(stat_s3.1_WR_complete[36,5])
## calculate % control for each treatment
stat_s3.1_WR_complete$control <- as.numeric(stat_s3.1_WR_complete[36,5])
stat_s3.1_WR_complete <- mutate(stat_s3.1_WR_complete, p_ctrl = (100* (Average / control)))
set_3.1_WR_bars <- ggplot(stat_s3.1_WR_complete, aes(x = isolate, y = Average))
set_3.1_WR_bars <- set_3.1_WR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_3.1_WR_bars <- set_3.1_WR_bars + geom_hline(aes(yintercept=set_3.1_WR_control_int), colour="#990000", linetype="dashed")
set_3.1_WR_bars <- set_3.1_WR_bars + labs(x="", y="Root - Fresh Weight (mg)")
set_3.1_WR_bars <- set_3.1_WR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.1_WR_bars <- set_3.1_WR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.1_WR_bars <- set_3.1_WR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.1_WR_bars <- set_3.1_WR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,145))
set_3.1_WR_bars <- set_3.1_WR_bars + geom_text(aes(x=isolate[18], y=132, label="194%"), hjust=0.38)
set_3.1_WR_bars

Cowplot - Set 3.1

set_3.1_wet_grid <- plot_grid(set_3.1_WS_bars + 
                                theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_3.1_WR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("A", "B"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_3.1_wet_grid

ggsave("./Plots/set_3.1_wet_grid.pdf", set_3.1_wet_grid, width = 16, height = 16)

Set 3.2

Wet Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s3.2_WS_complete <- stat_set_3.2_WS[complete.cases(stat_set_3.2_WS),]
## set the control value for Wet Shoot mg
set_3.2_WS_control_int <- as.numeric(stat_s3.2_WS_complete[24,5])
## calculate % control for each treatment
stat_s3.2_WS_complete$control <- as.numeric(stat_s3.2_WS_complete[24,5])
stat_s3.2_WS_complete <- mutate(stat_s3.2_WS_complete, p_ctrl = (100* (Average / control)))
set_3.2_WS_bars <- ggplot(stat_s3.2_WS_complete, aes(x = isolate, y = Average))
set_3.2_WS_bars <- set_3.2_WS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_3.2_WS_bars <- set_3.2_WS_bars + geom_hline(aes(yintercept=set_3.2_WS_control_int), colour="#990000", linetype="dashed")
set_3.2_WS_bars <- set_3.2_WS_bars + labs(x="", y="Shoot - Fresh Weight (mg)")
set_3.2_WS_bars <- set_3.2_WS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.2_WS_bars <- set_3.2_WS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.2_WS_bars <- set_3.2_WS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.2_WS_bars <- set_3.2_WS_bars + scale_y_continuous(expand = c(0,0))
set_3.2_WS_bars <- set_3.2_WS_bars + geom_text(aes(x=1, y=560, label="Stretch it"), vjust=-1)
set_3.2_WS_bars

Wet Root

# ggplot with bars
## remove isoaltes with NA values
stat_s3.2_WR_complete <- stat_set_3.2_WR[complete.cases(stat_set_3.2_WR),]
## set the control value for Wet Root mg
set_3.2_WR_control_int <- as.numeric(stat_s3.2_WR_complete[24,5])
## calculate % control for each treatment
stat_s3.2_WR_complete$control <- as.numeric(stat_s3.2_WR_complete[24,5])
stat_s3.2_WR_complete <- mutate(stat_s3.2_WR_complete, p_ctrl = (100* (Average / control)))
set_3.2_WR_bars <- ggplot(stat_s3.2_WR_complete, aes(x = isolate, y = Average))
set_3.2_WR_bars <- set_3.2_WR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_3.2_WR_bars <- set_3.2_WR_bars + geom_hline(aes(yintercept=set_3.2_WR_control_int), colour="#990000", linetype="dashed")
set_3.2_WR_bars <- set_3.2_WR_bars + labs(x="", y="Root - Fresh Weight (mg)")
set_3.2_WR_bars <- set_3.2_WR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.2_WR_bars <- set_3.2_WR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.2_WR_bars <- set_3.2_WR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.2_WR_bars <- set_3.2_WR_bars + scale_y_continuous(expand = c(0,0))
set_3.2_WR_bars <- set_3.2_WR_bars + geom_text(aes(x=1, y=95, label=""), vjust=-1)
set_3.2_WR_bars

Cowplot - Set 3.2

set_3.2_wet_grid <- plot_grid(set_3.2_WS_bars + 
                                theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_3.2_WR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("A", "B"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_3.2_wet_grid

ggsave("./Plots/set_3.2_wet_grid.pdf", set_3.2_wet_grid, width = 16, height = 16)

Set 3.3

Wet Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s3.3_WS_complete <- stat_set_3.3_WS[complete.cases(stat_set_3.3_WS),]
## set the control value for Wet Shoot mg
set_3.3_WS_control_int <- as.numeric(stat_s3.3_WS_complete[37,5])
## calculate % control for each treatment
stat_s3.3_WS_complete$control <- as.numeric(stat_s3.3_WS_complete[37,5])
stat_s3.3_WS_complete <- mutate(stat_s3.3_WS_complete, p_ctrl = (100* (Average / control)))
set_3.3_WS_bars <- ggplot(stat_s3.3_WS_complete, aes(x = isolate, y = Average))
set_3.3_WS_bars <- set_3.3_WS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_3.3_WS_bars <- set_3.3_WS_bars + geom_hline(aes(yintercept=set_3.3_WS_control_int), colour="#990000", linetype="dashed")
set_3.3_WS_bars <- set_3.3_WS_bars + labs(x="", y="Shoot - Fresh Weight (mg)")
set_3.3_WS_bars <- set_3.3_WS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.3_WS_bars <- set_3.3_WS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.3_WS_bars <- set_3.3_WS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.3_WS_bars <- set_3.3_WS_bars + scale_y_continuous(expand = c(0,0))
set_3.3_WS_bars <- set_3.3_WS_bars + geom_text(aes(x=1, y=990, label=""), vjust=-1)
set_3.3_WS_bars

Wet Root

# ggplot with bars
## remove isoaltes with NA values
stat_s3.3_WR_complete <- stat_set_3.3_WR[complete.cases(stat_set_3.3_WR),]
## set the control value for Wet Root mg
set_3.3_WR_control_int <- as.numeric(stat_s3.3_WR_complete[37,5])
## calculate % control for each treatment
stat_s3.3_WR_complete$control <- as.numeric(stat_s3.3_WR_complete[37,5])
stat_s3.3_WR_complete <- mutate(stat_s3.3_WR_complete, p_ctrl = (100* (Average / control)))
set_3.3_WR_bars <- ggplot(stat_s3.3_WR_complete, aes(x = isolate, y = Average))
set_3.3_WR_bars <- set_3.3_WR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_3.3_WR_bars <- set_3.3_WR_bars + geom_hline(aes(yintercept=set_3.3_WR_control_int), colour="#990000", linetype="dashed")
set_3.3_WR_bars <- set_3.3_WR_bars + labs(x="", y="Root - Fresh Weight (mg)")
set_3.3_WR_bars <- set_3.3_WR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.3_WR_bars <- set_3.3_WR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.3_WR_bars <- set_3.3_WR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.3_WR_bars <- set_3.3_WR_bars + scale_y_continuous(expand = c(0,0))
set_3.3_WR_bars <- set_3.3_WR_bars + geom_text(aes(x=1, y=175, label=""), vjust=-1)
set_3.3_WR_bars

Cowplot - Set 3.3

set_3.3_wet_grid <- plot_grid(set_3.3_WS_bars + 
                                theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_3.3_WR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("A", "B"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_3.3_wet_grid

ggsave("./Plots/set_3.3_wet_grid.pdf", set_3.3_wet_grid, width = 16, height = 16)

Set 3.4

Wet Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s3.4_WS_complete <- stat_set_3.4_WS[complete.cases(stat_set_3.4_WS),]
## set the control value for Wet Shoot mg
set_3.4_WS_control_int <- as.numeric(stat_s3.4_WS_complete[36,5])
## calculate % control for each treatment
stat_s3.4_WS_complete$control <- as.numeric(stat_s3.4_WS_complete[36,5])
stat_s3.4_WS_complete <- mutate(stat_s3.4_WS_complete, p_ctrl = (100* (Average / control)))
set_3.4_WS_bars <- ggplot(stat_s3.4_WS_complete, aes(x = isolate, y = Average))
set_3.4_WS_bars <- set_3.4_WS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_3.4_WS_bars <- set_3.4_WS_bars + geom_hline(aes(yintercept=set_3.4_WS_control_int), colour="#990000", linetype="dashed")
set_3.4_WS_bars <- set_3.4_WS_bars + labs(x="", y="Shoot - Fresh Weight (mg)")
set_3.4_WS_bars <- set_3.4_WS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.4_WS_bars <- set_3.4_WS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.4_WS_bars <- set_3.4_WS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.4_WS_bars <- set_3.4_WS_bars + scale_y_continuous(expand = c(0,0))
set_3.4_WS_bars <- set_3.4_WS_bars + geom_text(aes(x=1, y=580, label="Stretch it"), vjust=-1)
set_3.4_WS_bars

Wet Root

# ggplot with bars
## remove isoaltes with NA values
stat_s3.4_WR_complete <- stat_set_3.4_WR[complete.cases(stat_set_3.4_WR),]
## set the control value for Wet Root mg
set_3.4_WR_control_int <- as.numeric(stat_s3.4_WR_complete[36,5])
## calculate % control for each treatment
stat_s3.4_WR_complete$control <- as.numeric(stat_s3.4_WR_complete[36,5])
stat_s3.4_WR_complete <- mutate(stat_s3.4_WR_complete, p_ctrl = (100* (Average / control)))
set_3.4_WR_bars <- ggplot(stat_s3.4_WR_complete, aes(x = isolate, y = Average))
set_3.4_WR_bars <- set_3.4_WR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_3.4_WR_bars <- set_3.4_WR_bars + geom_hline(aes(yintercept=set_3.4_WR_control_int), colour="#990000", linetype="dashed")
set_3.4_WR_bars <- set_3.4_WR_bars + labs(x="", y="Root - Fresh Weight (mg)")
set_3.4_WR_bars <- set_3.4_WR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.4_WR_bars <- set_3.4_WR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.4_WR_bars <- set_3.4_WR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.4_WR_bars <- set_3.4_WR_bars + scale_y_continuous(expand = c(0,0))
set_3.4_WR_bars <- set_3.4_WR_bars + geom_text(aes(x=1, y=90, label=""), vjust=-1)
set_3.4_WR_bars

Cowplot - Set 3.4

set_3.4_wet_grid <- plot_grid(set_3.4_WS_bars + 
                                theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_3.4_WR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("A", "B"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_3.4_wet_grid

ggsave("./Plots/set_3.4_wet_grid.pdf", set_3.4_wet_grid, width = 16, height = 16)

Set 3.5

Wet Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s3.5_WS_complete <- stat_set_3.5_WS[complete.cases(stat_set_3.5_WS),]
## set the control value for Wet Shoot mg
set_3.5_WS_control_int <- as.numeric(stat_s3.5_WS_complete[20,5])
## calculate % control for each treatment
stat_s3.5_WS_complete$control <- as.numeric(stat_s3.5_WS_complete[20,5])
stat_s3.5_WS_complete <- mutate(stat_s3.5_WS_complete, p_ctrl = (100* (Average / control)))
set_3.5_WS_bars <- ggplot(stat_s3.5_WS_complete, aes(x = isolate, y = Average))
set_3.5_WS_bars <- set_3.5_WS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_3.5_WS_bars <- set_3.5_WS_bars + geom_hline(aes(yintercept=set_3.5_WS_control_int), colour="#990000", linetype="dashed")
set_3.5_WS_bars <- set_3.5_WS_bars + labs(x="", y="Shoot - Fresh Weight (mg)")
set_3.5_WS_bars <- set_3.5_WS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.5_WS_bars <- set_3.5_WS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.5_WS_bars <- set_3.5_WS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.5_WS_bars <- set_3.5_WS_bars + scale_y_continuous(expand = c(0,0))
set_3.5_WS_bars <- set_3.5_WS_bars + geom_text(aes(x=1, y=580, label="Stretch it"), vjust=-1)
set_3.5_WS_bars

Wet Root

# ggplot with bars
## remove isoaltes with NA values
stat_s3.5_WR_complete <- stat_set_3.5_WR[complete.cases(stat_set_3.5_WR),]
## set the control value for Wet Root mg
set_3.5_WR_control_int <- as.numeric(stat_s3.5_WR_complete[20,5])
## calculate % control for each treatment
stat_s3.5_WR_complete$control <- as.numeric(stat_s3.5_WR_complete[20,5])
stat_s3.5_WR_complete <- mutate(stat_s3.5_WR_complete, p_ctrl = (100* (Average / control)))
set_3.5_WR_bars <- ggplot(stat_s3.5_WR_complete, aes(x = isolate, y = Average))
set_3.5_WR_bars <- set_3.5_WR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_3.5_WR_bars <- set_3.5_WR_bars + geom_hline(aes(yintercept=set_3.5_WR_control_int), colour="#990000", linetype="dashed")
set_3.5_WR_bars <- set_3.5_WR_bars + labs(x="", y="Root - Fresh Weight (mg)")
set_3.5_WR_bars <- set_3.5_WR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.5_WR_bars <- set_3.5_WR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.5_WR_bars <- set_3.5_WR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.5_WR_bars <- set_3.5_WR_bars + scale_y_continuous(expand = c(0,0))
set_3.5_WR_bars <- set_3.5_WR_bars + geom_text(aes(x=1, y=99, label=""), vjust=-1)
set_3.5_WR_bars

Cowplot - Set 3.5

set_3.5_wet_grid <- plot_grid(set_3.5_WS_bars + 
                                theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_3.5_WR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("A", "B"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_3.5_wet_grid

ggsave("./Plots/set_3.5_wet_grid.pdf", set_3.5_wet_grid, width = 16, height = 16)

Set 4.1

Wet Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s4.1_WS_complete <- stat_set_4.1_WS[complete.cases(stat_set_4.1_WS),]
## set the control value for Wet Shoot mg
set_4.1_WS_control_int <- as.numeric(stat_s4.1_WS_complete[37,5])
## calculate % control for each treatment
stat_s4.1_WS_complete$control <- as.numeric(stat_s4.1_WS_complete[37,5])
stat_s4.1_WS_complete <- mutate(stat_s4.1_WS_complete, p_ctrl = (100* (Average / control)))
set_4.1_WS_bars <- ggplot(stat_s4.1_WS_complete, aes(x = isolate, y = Average))
set_4.1_WS_bars <- set_4.1_WS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_4.1_WS_bars <- set_4.1_WS_bars + geom_hline(aes(yintercept=set_4.1_WS_control_int), colour="#990000", linetype="dashed")
set_4.1_WS_bars <- set_4.1_WS_bars + labs(x="", y="Shoot - Fresh Weight (mg)")
set_4.1_WS_bars <- set_4.1_WS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_4.1_WS_bars <- set_4.1_WS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_4.1_WS_bars <- set_4.1_WS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_4.1_WS_bars <- set_4.1_WS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,750))
set_4.1_WS_bars <- set_4.1_WS_bars + geom_text(aes(x=isolate[25], y=680, label="189%"), hjust=0.38)
set_4.1_WS_bars

Wet Root

# ggplot with bars
## remove isoaltes with NA values
stat_s4.1_WR_complete <- stat_set_4.1_WR[complete.cases(stat_set_4.1_WR),]
## set the control value for Wet Root mg
set_4.1_WR_control_int <- as.numeric(stat_s4.1_WR_complete[37,5])
## calculate % control for each treatment
stat_s4.1_WR_complete$control <- as.numeric(stat_s4.1_WR_complete[37,5])
stat_s4.1_WR_complete <- mutate(stat_s4.1_WR_complete, p_ctrl = (100* (Average / control)))
set_4.1_WR_bars <- ggplot(stat_s4.1_WR_complete, aes(x = isolate, y = Average))
set_4.1_WR_bars <- set_4.1_WR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_4.1_WR_bars <- set_4.1_WR_bars + geom_hline(aes(yintercept=set_4.1_WR_control_int), colour="#990000", linetype="dashed")
set_4.1_WR_bars <- set_4.1_WR_bars + labs(x="", y="Root - Fresh Weight (mg)")
set_4.1_WR_bars <- set_4.1_WR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_4.1_WR_bars <- set_4.1_WR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_4.1_WR_bars <- set_4.1_WR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_4.1_WR_bars <- set_4.1_WR_bars + scale_y_continuous(expand = c(0,0))
set_4.1_WR_bars <- set_4.1_WR_bars + geom_text(aes(x=1, y=59, label=""), vjust=-1)
set_4.1_WR_bars

Cowplot - Set 4.1

set_4.1_wet_grid <- plot_grid(set_4.1_WS_bars + 
                                theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_4.1_WR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("A", "B"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_4.1_wet_grid

ggsave("./Plots/set_4.1_wet_grid.pdf", set_4.1_wet_grid, width = 16, height = 16)

Set 4.2

Wet Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s4.2_WS_complete <- stat_set_4.2_WS[complete.cases(stat_set_4.2_WS),]
## set the control value for Wet Shoot mg
set_4.2_WS_control_int <- as.numeric(stat_s4.2_WS_complete[23,5])
## calculate % control for each treatment
stat_s4.2_WS_complete$control <- as.numeric(stat_s4.2_WS_complete[23,5])
stat_s4.2_WS_complete <- mutate(stat_s4.2_WS_complete, p_ctrl = (100* (Average / control)))
set_4.2_WS_bars <- ggplot(stat_s4.2_WS_complete, aes(x = isolate, y = Average))
set_4.2_WS_bars <- set_4.2_WS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_4.2_WS_bars <- set_4.2_WS_bars + geom_hline(aes(yintercept=set_4.2_WS_control_int), colour="#990000", linetype="dashed")
set_4.2_WS_bars <- set_4.2_WS_bars + labs(x="", y="Shoot - Fresh Weight (mg)")
set_4.2_WS_bars <- set_4.2_WS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_4.2_WS_bars <- set_4.2_WS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_4.2_WS_bars <- set_4.2_WS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_4.2_WS_bars <- set_4.2_WS_bars + scale_y_continuous(expand = c(0,0))
set_4.2_WS_bars <- set_4.2_WS_bars + geom_text(aes(x=1, y=590, label="Stretch it"), vjust=-1)
set_4.2_WS_bars

Wet Root

# ggplot with bars
## remove isoaltes with NA values
stat_s4.2_WR_complete <- stat_set_4.2_WR[complete.cases(stat_set_4.2_WR),]
## set the control value for Wet Root mg
set_4.2_WR_control_int <- as.numeric(stat_s4.2_WR_complete[23,5])
## calculate % control for each treatment
stat_s4.2_WR_complete$control <- as.numeric(stat_s4.2_WR_complete[23,5])
stat_s4.2_WR_complete <- mutate(stat_s4.2_WR_complete, p_ctrl = (100* (Average / control)))
set_4.2_WR_bars <- ggplot(stat_s4.2_WR_complete, aes(x = isolate, y = Average))
set_4.2_WR_bars <- set_4.2_WR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_4.2_WR_bars <- set_4.2_WR_bars + geom_hline(aes(yintercept=set_4.2_WR_control_int), colour="#990000", linetype="dashed")
set_4.2_WR_bars <- set_4.2_WR_bars + labs(x="", y="Root - Fresh Weight (mg)")
set_4.2_WR_bars <- set_4.2_WR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_4.2_WR_bars <- set_4.2_WR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_4.2_WR_bars <- set_4.2_WR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_4.2_WR_bars <- set_4.2_WR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,59))
set_4.2_WR_bars <- set_4.2_WR_bars + geom_text(aes(x=isolate[6], y=55, label="317%"), hjust=0.38)
set_4.2_WR_bars <- set_4.2_WR_bars + geom_text(aes(x=isolate[8], y=51, label="305%"), hjust=0.38)
set_4.2_WR_bars

Cowplot - Set 4.2

set_4.2_wet_grid <- plot_grid(set_4.2_WS_bars + 
                                theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_4.2_WR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("A", "B"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_4.2_wet_grid

ggsave("./Plots/set_4.2_wet_grid.pdf", set_4.2_wet_grid, width = 16, height = 16)

Set 4.3

Wet Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s4.3_WS_complete <- stat_set_4.3_WS[complete.cases(stat_set_4.3_WS),]
## set the control value for Wet Shoot mg
set_4.3_WS_control_int <- as.numeric(stat_s4.3_WS_complete[25,5])
## calculate % control for each treatment
stat_s4.3_WS_complete$control <- as.numeric(stat_s4.3_WS_complete[25,5])
stat_s4.3_WS_complete <- mutate(stat_s4.3_WS_complete, p_ctrl = (100* (Average / control)))
set_4.3_WS_bars <- ggplot(stat_s4.3_WS_complete, aes(x = isolate, y = Average))
set_4.3_WS_bars <- set_4.3_WS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_4.3_WS_bars <- set_4.3_WS_bars + geom_hline(aes(yintercept=set_4.3_WS_control_int), colour="#990000", linetype="dashed")
set_4.3_WS_bars <- set_4.3_WS_bars + labs(x="", y="Shoot - Fresh Weight (mg)")
set_4.3_WS_bars <- set_4.3_WS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_4.3_WS_bars <- set_4.3_WS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_4.3_WS_bars <- set_4.3_WS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_4.3_WS_bars <- set_4.3_WS_bars + scale_y_continuous(expand = c(0,0))
set_4.3_WS_bars <- set_4.3_WS_bars + geom_text(aes(x=1, y=495, label="Stretch it"), vjust=-1)
set_4.3_WS_bars

Wet Root

# ggplot with bars
## remove isoaltes with NA values
stat_s4.3_WR_complete <- stat_set_4.3_WR[complete.cases(stat_set_4.3_WR),]
## set the control value for Wet Root mg
set_4.3_WR_control_int <- as.numeric(stat_s4.3_WR_complete[25,5])
## calculate % control for each treatment
stat_s4.3_WR_complete$control <- as.numeric(stat_s4.3_WR_complete[25,5])
stat_s4.3_WR_complete <- mutate(stat_s4.3_WR_complete, p_ctrl = (100* (Average / control)))
set_4.3_WR_bars <- ggplot(stat_s4.3_WR_complete, aes(x = isolate, y = Average))
set_4.3_WR_bars <- set_4.3_WR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_4.3_WR_bars <- set_4.3_WR_bars + geom_hline(aes(yintercept=set_4.3_WR_control_int), colour="#990000", linetype="dashed")
set_4.3_WR_bars <- set_4.3_WR_bars + labs(x="", y="Root - Fresh Weight (mg)")
set_4.3_WR_bars <- set_4.3_WR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_4.3_WR_bars <- set_4.3_WR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_4.3_WR_bars <- set_4.3_WR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_4.3_WR_bars <- set_4.3_WR_bars + scale_y_continuous(expand = c(0,0))
set_4.3_WR_bars <- set_4.3_WR_bars + geom_text(aes(x=1, y=49, label=""), vjust=-1)
set_4.3_WR_bars

Cowplot - Set 4.3

set_4.3_wet_grid <- plot_grid(set_4.3_WS_bars + 
                                theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_4.3_WR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("A", "B"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_4.3_wet_grid

ggsave("./Plots/set_4.3_wet_grid.pdf", set_4.3_wet_grid, width = 16, height = 16)

Add Batch ID to Dry Weight Dataframes

# add batch id variable to each dataset
## Set 1
### Dry Shoot
set_1_DS_id <- set_1_DS
set_1_DS_id$batch <- c("Set 1")
### Dry Root
set_1_DR_id <- set_1_DR
set_1_DR_id$batch <- c("Set 1")
## Set 2.1
### Dry Shoot
set_2.1_DS_id <- set_2.1_DS
set_2.1_DS_id$batch <- c("Set 2.1")
### Dry Root
set_2.1_DR_id <- set_2.1_DR
set_2.1_DR_id$batch <- c("Set 2.1")
## Set 2.2
### Dry Shoot
set_2.2_DS_id <- set_2.2_DS
set_2.2_DS_id$batch <- c("Set 2.2")
### Dry Root
set_2.2_DR_id <- set_2.2_DR
set_2.2_DR_id$batch <- c("Set 2.2")
## Set 2.3
### Dry Shoot
set_2.3_DS_id <- set_2.3_DS
set_2.3_DS_id$batch <- c("Set 2.3")
### Dry Root
set_2.3_DR_id <- set_2.3_DR
set_2.3_DR_id$batch <- c("Set 2.3")
## Set 2.4
### Dry Shoot
set_2.4_DS_id <- set_2.4_DS
set_2.4_DS_id$batch <- c("Set 2.4")
### Dry Root
set_2.4_DR_id <- set_2.4_DR
set_2.4_DR_id$batch <- c("Set 2.4")
## Set 3.1
### Dry Shoot
set_3.1_DS_id <- set_3.1_DS
set_3.1_DS_id$batch <- c("Set 3.1")
### Dry Root
set_3.1_DR_id <- set_3.1_DR
set_3.1_DR_id$batch <- c("Set 3.1")
## Set 3.2
### Dry Shoot
set_3.2_DS_id <- set_3.2_DS
set_3.2_DS_id$batch <- c("Set 3.2")
### Dry Root
set_3.2_DR_id <- set_3.2_DR
set_3.2_DR_id$batch <- c("Set 3.2")
## Set 3.3
### Dry Shoot
set_3.3_DS_id <- set_3.3_DS
set_3.3_DS_id$batch <- c("Set 3.3")
### Dry Root
set_3.3_DR_id <- set_3.3_DR
set_3.3_DR_id$batch <- c("Set 3.3")
## Set 3.4
### Dry Shoot
set_3.4_DS_id <- set_3.4_DS
set_3.4_DS_id$batch <- c("Set 3.4")
### Dry Root
set_3.4_DR_id <- set_3.4_DR
set_3.4_DR_id$batch <- c("Set 3.4")
## Set 3.5
### Dry Shoot
set_3.5_DS_id <- set_3.5_DS
set_3.5_DS_id$batch <- c("Set 3.5")
### Dry Root
set_3.5_DR_id <- set_3.5_DR
set_3.5_DR_id$batch <- c("Set 3.5")
## Set 4.1
### Dry Shoot
set_4.1_DS_id <- set_4.1_DS
set_4.1_DS_id$batch <- c("Set 4.1")
### Dry Root
set_4.1_DR_id <- set_4.1_DR
set_4.1_DR_id$batch <- c("Set 4.1")
## Set 4.2
### Dry Shoot
set_4.2_DS_id <- set_4.2_DS
set_4.2_DS_id$batch <- c("Set 4.2")
### Dry Root
set_4.2_DR_id <- set_4.2_DR
set_4.2_DR_id$batch <- c("Set 4.2")
## Set 4.3
### Dry Shoot
set_4.3_DS_id <- set_4.3_DS
set_4.3_DS_id$batch <- c("Set 4.3")
### Dry Root
set_4.3_DR_id <- set_4.3_DR
set_4.3_DR_id$batch <- c("Set 4.3")

Group the Data for Plotting

#Group the datasets based on Sample ID and prep method
## Set 1
set_1_DS_grouped <- group_by(set_1_DS_id, isolate, sample, batch)
set_1_DR_grouped <- group_by(set_1_DR_id, isolate, sample, batch)
## Set 2.1
set_2.1_DS_grouped <- group_by(set_2.1_DS_id, isolate, sample, batch)
set_2.1_DR_grouped <- group_by(set_2.1_DR_id, isolate, sample, batch)
## Set 2.2
set_2.2_DS_grouped <- group_by(set_2.2_DS_id, isolate, sample, batch)
set_2.2_DR_grouped <- group_by(set_2.2_DR_id, isolate, sample, batch)
## Set 2.3
set_2.3_DS_grouped <- group_by(set_2.3_DS_id, isolate, sample, batch)
set_2.3_DR_grouped <- group_by(set_2.3_DR_id, isolate, sample, batch)
## Set 2.4
set_2.4_DS_grouped <- group_by(set_2.4_DS_id, isolate, sample, batch)
set_2.4_DR_grouped <- group_by(set_2.4_DR_id, isolate, sample, batch)
## Set 3.1
set_3.1_DS_grouped <- group_by(set_3.1_DS_id, isolate, sample, batch)
set_3.1_DR_grouped <- group_by(set_3.1_DR_id, isolate, sample, batch)
## Set 3.2
set_3.2_DS_grouped <- group_by(set_3.2_DS_id, isolate, sample, batch)
set_3.2_DR_grouped <- group_by(set_3.2_DR_id, isolate, sample, batch)
## Set 3.3
set_3.3_DS_grouped <- group_by(set_3.3_DS_id, isolate, sample, batch)
set_3.3_DR_grouped <- group_by(set_3.3_DR_id, isolate, sample, batch)
## Set 3.4
set_3.4_DS_grouped <- group_by(set_3.4_DS_id, isolate, sample, batch)
set_3.4_DR_grouped <- group_by(set_3.4_DR_id, isolate, sample, batch)
## Set 3.5
set_3.5_DS_grouped <- group_by(set_3.5_DS_id, isolate, sample, batch)
set_3.5_DR_grouped <- group_by(set_3.5_DR_id, isolate, sample, batch)
## Set 4.1
set_4.1_DS_grouped <- group_by(set_4.1_DS_id, isolate, sample, batch)
set_4.1_DR_grouped <- group_by(set_4.1_DR_id, isolate, sample, batch)
## Set 4.2
set_4.2_DS_grouped <- group_by(set_4.2_DS_id, isolate, sample, batch)
set_4.2_DR_grouped <- group_by(set_4.2_DR_id, isolate, sample, batch)
## Set 4.3
set_4.3_DS_grouped <- group_by(set_4.3_DS_id, isolate, sample, batch)
set_4.3_DR_grouped <- group_by(set_4.3_DR_id, isolate, sample, batch)

Compute stats over triplicates for plotting

# set 1
stat_set_1_DS <- summarise(set_1_DS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_1_DR <- summarise(set_1_DR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 2.1
stat_set_2.1_DS <- summarise(set_2.1_DS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_2.1_DR <- summarise(set_2.1_DR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 2.2
stat_set_2.2_DS <- summarise(set_2.2_DS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_2.2_DR <- summarise(set_2.2_DR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 2.3
stat_set_2.3_DS <- summarise(set_2.3_DS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_2.3_DR <- summarise(set_2.3_DR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 2.4
stat_set_2.4_DS <- summarise(set_2.4_DS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_2.4_DR <- summarise(set_2.4_DR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 3.1
stat_set_3.1_DS <- summarise(set_3.1_DS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_3.1_DR <- summarise(set_3.1_DR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 3.2
stat_set_3.2_DS <- summarise(set_3.2_DS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_3.2_DR <- summarise(set_3.2_DR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 3.3
stat_set_3.3_DS <- summarise(set_3.3_DS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_3.3_DR <- summarise(set_3.3_DR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 3.4
stat_set_3.4_DS <- summarise(set_3.4_DS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_3.4_DR <- summarise(set_3.4_DR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 3.5
stat_set_3.5_DS <- summarise(set_3.5_DS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_3.5_DR <- summarise(set_3.5_DR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 4.1
stat_set_4.1_DS <- summarise(set_4.1_DS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_4.1_DR <- summarise(set_4.1_DR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 4.2
stat_set_4.2_DS <- summarise(set_4.2_DS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_4.2_DR <- summarise(set_4.2_DR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
# set 4.3
stat_set_4.3_DS <- summarise(set_4.3_DS_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))
stat_set_4.3_DR <- summarise(set_4.3_DR_grouped, N=length(mg), Average=mean(mg, na.rm = TRUE), CI95=conf_int95(mg), SE=std_error(mg))

Dry Weight Plots

Set 1

Dry Shoot

# ggplot with bars
## set the control value for Dry Shoot mg
set_1_DS_control_int <- as.numeric(stat_set_1_DS[58,5])
## remove isoaltes with NA values
stat_s1_DS_complete <- stat_set_1_DS[complete.cases(stat_set_1_DS),]
## remove control-WO
stat_s1_DS_complete <- filter(stat_s1_DS_complete, isolate != "control-WO")
## calculate % control for each treatment
stat_s1_DS_complete$control <- as.numeric(stat_set_1_DS[58,5])
stat_s1_DS_complete <- mutate(stat_s1_DS_complete, p_ctrl = (100* (Average / control)))
## Make the plot
set_1_DS_bars <- ggplot(stat_s1_DS_complete, aes(x = isolate, y = Average))
set_1_DS_bars <- set_1_DS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_1_DS_bars <- set_1_DS_bars + geom_hline(aes(yintercept=set_1_DS_control_int), colour="#990000", linetype="dashed")
set_1_DS_bars <- set_1_DS_bars + labs(x="", y="Shoot - Dry Weight (mg)")
set_1_DS_bars <- set_1_DS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
#set_1_DS_bars <- set_1_DS_bars + geom_text(aes(label=sprintf("%0.0f", round(p_ctrl, digits = 0)), y=Average+SE, vjust=-0.5), hjust = 0, angle = 45)
set_1_DS_bars <- set_1_DS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_1_DS_bars <- set_1_DS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_1_DS_bars <- set_1_DS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,45))
set_1_DS_bars <- set_1_DS_bars + geom_text(aes(x=isolate[11], y=42, label="205%"), hjust=0.38)
set_1_DS_bars

Dry Root

# ggplot with bars
## remove isoaltes with NA values
stat_s1_DR_complete <- stat_set_1_DR[complete.cases(stat_set_1_DR),]
## remove control-WO
stat_s1_DR_complete <- filter(stat_s1_DR_complete, isolate != "control-WO")
## set the control value for Dry Shoot mg
set_1_DR_control_int <- as.numeric(stat_s1_DR_complete[39,5])
## calculate % control for each treatment
stat_s1_DR_complete$control <- as.numeric(stat_set_1_DR[58,5])
stat_s1_DR_complete <- mutate(stat_s1_DR_complete, p_ctrl = (100* (Average / control)))
## Plot
set_1_DR_bars <- ggplot(stat_s1_DR_complete, aes(x = isolate, y = Average))
set_1_DR_bars <- set_1_DR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_1_DR_bars <- set_1_DR_bars + geom_hline(aes(yintercept=set_1_DR_control_int), colour="#990000", linetype="dashed")
set_1_DR_bars <- set_1_DR_bars + labs(x="", y="Root - Dry Weight (mg)")
set_1_DR_bars <- set_1_DR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_1_DR_bars <- set_1_DR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_1_DR_bars <- set_1_DR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_1_DR_bars <- set_1_DR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,19))
set_1_DR_bars <- set_1_DR_bars + geom_text(aes(x=isolate[27], y=17, label="202%"), hjust=0.38)
set_1_DR_bars

Cowplot - Set 1 - Full

set_1_dry_grid <- plot_grid(set_1_DS_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_1_DR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("C", "D"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_1_full_grid <- plot_grid(set_1_wet_grid,
                             set_1_dry_grid,
                             ncol = 2)
set_1_full_grid

ggsave("./Plots/set_1_full_grid.pdf", set_1_full_grid, width = 16, height = 16)

Set 2.1

Dry Shoot

# ggplot with bars
## set the control value for Dry Shoot mg
set_2.1_DS_control_int <- as.numeric(stat_set_2.1_DS[33,5])
## remove isoaltes with NA values
stat_s2.1_DS_complete <- stat_set_2.1_DS[complete.cases(stat_set_2.1_DS),]
## remove control-WO
stat_s2.1_DS_complete <- filter(stat_s2.1_DS_complete, isolate != "control-WO")
## calculate % control for each treatment
stat_s2.1_DS_complete$control <- as.numeric(stat_set_2.1_DS[33,5])
stat_s2.1_DS_complete <- mutate(stat_s2.1_DS_complete, p_ctrl = (100* (Average / control)))
## Make the plot
set_2.1_DS_bars <- ggplot(stat_s2.1_DS_complete, aes(x = isolate, y = Average))
set_2.1_DS_bars <- set_2.1_DS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_2.1_DS_bars <- set_2.1_DS_bars + geom_hline(aes(yintercept=set_2.1_DS_control_int), colour="#990000", linetype="dashed")
set_2.1_DS_bars <- set_2.1_DS_bars + labs(x="", y="Shoot - Dry Weight (mg)")
set_2.1_DS_bars <- set_2.1_DS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
#set_2.1_DS_bars <- set_2.1_DS_bars + geom_text(aes(label=sprintf("%0.0f", round(p_ctrl, digits = 0)), y=Average+SE, vjust=-0.5), hjust = 0, angle = 45)
set_2.1_DS_bars <- set_2.1_DS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.1_DS_bars <- set_2.1_DS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.1_DS_bars <- set_2.1_DS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,45))
set_2.1_DS_bars <- set_2.1_DS_bars + geom_text(aes(x=isolate[12], y=41, label="323%"), hjust=0.38)
set_2.1_DS_bars

Dry Root

# ggplot with bars
## set the control value for Dry Root mg
## remove isoaltes with NA values
stat_s2.1_DR_complete <- stat_set_2.1_DR[complete.cases(stat_set_2.1_DR),]
## remove control-WO
stat_s2.1_DR_complete <- filter(stat_s2.1_DR_complete, isolate != "control-WO")
set_2.1_DR_control_int <- as.numeric(stat_s2.1_DR_complete[31,5])
## calculate % control for each treatment
stat_s2.1_DR_complete$control <- as.numeric(stat_set_2.1_DR[31,5])
stat_s2.1_DR_complete <- mutate(stat_s2.1_DR_complete, p_ctrl = (100* (Average / control)))
## Plot
set_2.1_DR_bars <- ggplot(stat_s2.1_DR_complete, aes(x = isolate, y = Average))
set_2.1_DR_bars <- set_2.1_DR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_2.1_DR_bars <- set_2.1_DR_bars + geom_hline(aes(yintercept=set_2.1_DR_control_int), colour="#990000", linetype="dashed")
set_2.1_DR_bars <- set_2.1_DR_bars + labs(x="", y="Root - Dry Weight (mg)")
set_2.1_DR_bars <- set_2.1_DR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_2.1_DR_bars <- set_2.1_DR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.1_DR_bars <- set_2.1_DR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.1_DR_bars <- set_2.1_DR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,11.5))
set_2.1_DR_bars <- set_2.1_DR_bars + geom_text(aes(x=isolate[24], y=10.5, label="190%"), hjust=0.38)
set_2.1_DR_bars <- set_2.1_DR_bars + geom_text(aes(x=isolate[21], y=10, label="182%"), hjust=0.38)
set_2.1_DR_bars

Cowplot - Set 2.1 - Full

set_2.1_dry_grid <- plot_grid(set_2.1_DS_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_2.1_DR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("C", "D"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_2.1_full_grid <- plot_grid(set_2.1_wet_grid,
                             set_2.1_dry_grid,
                             ncol = 2)
set_2.1_full_grid

ggsave("./Plots/set_2.1_full_grid.pdf", set_2.1_full_grid, width = 16, height = 16)

Set 2.2

Dry Shoot

# ggplot with bars
## set the control value for Dry Shoot mg
set_2.2_DS_control_int <- as.numeric(stat_set_2.2_DS[33,5])
## remove isoaltes with NA values
stat_s2.2_DS_complete <- stat_set_2.2_DS[complete.cases(stat_set_2.2_DS),]
## remove control-WO
stat_s2.2_DS_complete <- filter(stat_s2.2_DS_complete, isolate != "control-WO")
## calculate % control for each treatment
stat_s2.2_DS_complete$control <- as.numeric(stat_set_2.2_DS[33,5])
stat_s2.2_DS_complete <- mutate(stat_s2.2_DS_complete, p_ctrl = (100* (Average / control)))
## Make the plot
set_2.2_DS_bars <- ggplot(stat_s2.2_DS_complete, aes(x = isolate, y = Average))
set_2.2_DS_bars <- set_2.2_DS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_2.2_DS_bars <- set_2.2_DS_bars + geom_hline(aes(yintercept=set_2.2_DS_control_int), colour="#990000", linetype="dashed")
set_2.2_DS_bars <- set_2.2_DS_bars + labs(x="", y="Shoot - Dry Weight (mg)")
set_2.2_DS_bars <- set_2.2_DS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
#set_2.2_DS_bars <- set_2.2_DS_bars + geom_text(aes(label=sprintf("%0.0f", round(p_ctrl, digits = 0)), y=Average+SE, vjust=-0.5), hjust = 0, angle = 45)
set_2.2_DS_bars <- set_2.2_DS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.2_DS_bars <- set_2.2_DS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.2_DS_bars <- set_2.2_DS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,65))
set_2.2_DS_bars <- set_2.2_DS_bars + geom_text(aes(x=isolate[26], y=61, label="318%"), hjust=0.38)
set_2.2_DS_bars

Dry Root

# ggplot with bars
## set the control value for Dry Root mg
## remove isoaltes with NA values
stat_s2.2_DR_complete <- stat_set_2.2_DR[complete.cases(stat_set_2.2_DR),]
## remove control-WO
stat_s2.2_DR_complete <- filter(stat_s2.2_DR_complete, isolate != "control-WO")
set_2.2_DR_control_int <- as.numeric(stat_s2.2_DR_complete[32,5])
## calculate % control for each treatment
stat_s2.2_DR_complete$control <- as.numeric(stat_set_2.2_DR[32,5])
stat_s2.2_DR_complete <- mutate(stat_s2.2_DR_complete, p_ctrl = (100* (Average / control)))
## Plot
set_2.2_DR_bars <- ggplot(stat_s2.2_DR_complete, aes(x = isolate, y = Average))
set_2.2_DR_bars <- set_2.2_DR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_2.2_DR_bars <- set_2.2_DR_bars + geom_hline(aes(yintercept=set_2.2_DR_control_int), colour="#990000", linetype="dashed")
set_2.2_DR_bars <- set_2.2_DR_bars + labs(x="", y="Root - Dry Weight (mg)")
set_2.2_DR_bars <- set_2.2_DR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_2.2_DR_bars <- set_2.2_DR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.2_DR_bars <- set_2.2_DR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.2_DR_bars <- set_2.2_DR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,13.8))
set_2.2_DR_bars <- set_2.2_DR_bars + geom_text(aes(x=isolate[26], y=13, label="237%"), hjust=0.38)
set_2.2_DR_bars

Cowplot - Set 2.2 - Full

set_2.2_dry_grid <- plot_grid(set_2.2_DS_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_2.2_DR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("C", "D"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_2.2_full_grid <- plot_grid(set_2.2_wet_grid,
                             set_2.2_dry_grid,
                             ncol = 2)
set_2.2_full_grid

ggsave("./Plots/set_2.2_full_grid.pdf", set_2.2_full_grid, width = 16, height = 16)

Set 2.3

Dry Shoot

# ggplot with bars
## set the control value for Dry Shoot mg
set_2.3_DS_control_int <- as.numeric(stat_set_2.3_DS[28,5])
## remove isoaltes with NA values
stat_s2.3_DS_complete <- stat_set_2.3_DS[complete.cases(stat_set_2.3_DS),]
## remove control-WO
stat_s2.3_DS_complete <- filter(stat_s2.3_DS_complete, isolate != "control-WO")
## calculate % control for each treatment
stat_s2.3_DS_complete$control <- as.numeric(stat_set_2.3_DS[28,5])
stat_s2.3_DS_complete <- mutate(stat_s2.3_DS_complete, p_ctrl = (100* (Average / control)))
## Make the plot
set_2.3_DS_bars <- ggplot(stat_s2.3_DS_complete, aes(x = isolate, y = Average))
set_2.3_DS_bars <- set_2.3_DS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_2.3_DS_bars <- set_2.3_DS_bars + geom_hline(aes(yintercept=set_2.3_DS_control_int), colour="#990000", linetype="dashed")
set_2.3_DS_bars <- set_2.3_DS_bars + labs(x="", y="Shoot - Dry Weight (mg)")
set_2.3_DS_bars <- set_2.3_DS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
#set_2.3_DS_bars <- set_2.3_DS_bars + geom_text(aes(label=sprintf("%0.0f", round(p_ctrl, digits = 0)), y=Average+SE, vjust=-0.5), hjust = 0, angle = 45)
set_2.3_DS_bars <- set_2.3_DS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.3_DS_bars <- set_2.3_DS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.3_DS_bars <- set_2.3_DS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,45))
#set_2.3_DS_bars <- set_2.3_DS_bars + geom_text(aes(x=isolate[26], y=61, label="318%"), hjust=0.38)
set_2.3_DS_bars

Dry Root

# ggplot with bars
## set the control value for Dry Root mg
## remove isoaltes with NA values
stat_s2.3_DR_complete <- stat_set_2.3_DR[complete.cases(stat_set_2.3_DR),]
## remove control-WO
stat_s2.3_DR_complete <- filter(stat_s2.3_DR_complete, isolate != "control-WO")
set_2.3_DR_control_int <- as.numeric(stat_s2.3_DR_complete[25,5])
## calculate % control for each treatment
stat_s2.3_DR_complete$control <- as.numeric(stat_set_2.3_DR[25,5])
stat_s2.3_DR_complete <- mutate(stat_s2.3_DR_complete, p_ctrl = (100* (Average / control)))
## Plot
set_2.3_DR_bars <- ggplot(stat_s2.3_DR_complete, aes(x = isolate, y = Average))
set_2.3_DR_bars <- set_2.3_DR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_2.3_DR_bars <- set_2.3_DR_bars + geom_hline(aes(yintercept=set_2.3_DR_control_int), colour="#990000", linetype="dashed")
set_2.3_DR_bars <- set_2.3_DR_bars + labs(x="", y="Root - Dry Weight (mg)")
set_2.3_DR_bars <- set_2.3_DR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_2.3_DR_bars <- set_2.3_DR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.3_DR_bars <- set_2.3_DR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.3_DR_bars <- set_2.3_DR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,17.5))
#set_2.3_DR_bars <- set_2.3_DR_bars + geom_text(aes(x=isolate[26], y=13, label="237%"), hjust=0.38)
set_2.3_DR_bars

Cowplot - Set 2.3 - Full

set_2.3_dry_grid <- plot_grid(set_2.3_DS_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_2.3_DR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("C", "D"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_2.3_full_grid <- plot_grid(set_2.3_wet_grid,
                             set_2.3_dry_grid,
                             ncol = 2)
set_2.3_full_grid

ggsave("./Plots/set_2.3_full_grid.pdf", set_2.3_full_grid, width = 16, height = 16)

Set 2.4

Dry Shoot

# ggplot with bars
## set the control value for Dry Shoot mg
set_2.4_DS_control_int <- as.numeric(stat_set_2.4_DS[37,5])
## remove isoaltes with NA values
stat_s2.4_DS_complete <- stat_set_2.4_DS[complete.cases(stat_set_2.4_DS),]
## remove control-WO
stat_s2.4_DS_complete <- filter(stat_s2.4_DS_complete, isolate != "control-WO")
## calculate % control for each treatment
stat_s2.4_DS_complete$control <- as.numeric(stat_set_2.4_DS[37,5])
stat_s2.4_DS_complete <- mutate(stat_s2.4_DS_complete, p_ctrl = (100* (Average / control)))
## Make the plot
set_2.4_DS_bars <- ggplot(stat_s2.4_DS_complete, aes(x = isolate, y = Average))
set_2.4_DS_bars <- set_2.4_DS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_2.4_DS_bars <- set_2.4_DS_bars + geom_hline(aes(yintercept=set_2.4_DS_control_int), colour="#990000", linetype="dashed")
set_2.4_DS_bars <- set_2.4_DS_bars + labs(x="", y="Shoot - Dry Weight (mg)")
set_2.4_DS_bars <- set_2.4_DS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
#set_2.4_DS_bars <- set_2.4_DS_bars + geom_text(aes(label=sprintf("%0.0f", round(p_ctrl, digits = 0)), y=Average+SE, vjust=-0.5), hjust = 0, angle = 45)
set_2.4_DS_bars <- set_2.4_DS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.4_DS_bars <- set_2.4_DS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.4_DS_bars <- set_2.4_DS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,55))
set_2.4_DS_bars <- set_2.4_DS_bars + geom_text(aes(x=isolate[25], y=51, label="251%"), hjust=0.38)
set_2.4_DS_bars <- set_2.4_DS_bars + geom_text(aes(x=isolate[34], y=47, label="262%"), hjust=0.38)
set_2.4_DS_bars

Dry Root

# ggplot with bars
## set the control value for Dry Root mg
## remove isoaltes with NA values
stat_s2.4_DR_complete <- stat_set_2.4_DR[complete.cases(stat_set_2.4_DR),]
## remove control-WO
stat_s2.4_DR_complete <- filter(stat_s2.4_DR_complete, isolate != "control-WO")
set_2.4_DR_control_int <- as.numeric(stat_s2.4_DR_complete[36,5])
## calculate % control for each treatment
stat_s2.4_DR_complete$control <- as.numeric(stat_set_2.4_DR[36,5])
stat_s2.4_DR_complete <- mutate(stat_s2.4_DR_complete, p_ctrl = (100* (Average / control)))
## Plot
set_2.4_DR_bars <- ggplot(stat_s2.4_DR_complete, aes(x = isolate, y = Average))
set_2.4_DR_bars <- set_2.4_DR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_2.4_DR_bars <- set_2.4_DR_bars + geom_hline(aes(yintercept=set_2.4_DR_control_int), colour="#990000", linetype="dashed")
set_2.4_DR_bars <- set_2.4_DR_bars + labs(x="", y="Root - Dry Weight (mg)")
set_2.4_DR_bars <- set_2.4_DR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_2.4_DR_bars <- set_2.4_DR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_2.4_DR_bars <- set_2.4_DR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_2.4_DR_bars <- set_2.4_DR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,14))
set_2.4_DR_bars <- set_2.4_DR_bars + geom_text(aes(x=isolate[34], y=10, label="198%"), hjust=0.38)
set_2.4_DR_bars

Cowplot - Set 2.4 - Full

set_2.4_dry_grid <- plot_grid(set_2.4_DS_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_2.4_DR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("C", "D"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_2.4_full_grid <- plot_grid(set_2.4_wet_grid,
                             set_2.4_dry_grid,
                             ncol = 2)
set_2.4_full_grid

ggsave("./Plots/set_2.4_full_grid.pdf", set_2.4_full_grid, width = 16, height = 16)

Set 3.1

Dry Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s3.1_DS_complete <- stat_set_3.1_DS[complete.cases(stat_set_3.1_DS),]
## set the control value for Dry Shoot mg
set_3.1_DS_control_int <- as.numeric(stat_s3.1_DS_complete[36,5])
## calculate % control for each treatment
stat_s3.1_DS_complete$control <- as.numeric(stat_s3.1_DS_complete[36,5])
stat_s3.1_DS_complete <- mutate(stat_s3.1_DS_complete, p_ctrl = (100* (Average / control)))
set_3.1_DS_bars <- ggplot(stat_s3.1_DS_complete, aes(x = isolate, y = Average))
set_3.1_DS_bars <- set_3.1_DS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_3.1_DS_bars <- set_3.1_DS_bars + geom_hline(aes(yintercept=set_3.1_DS_control_int), colour="#990000", linetype="dashed")
set_3.1_DS_bars <- set_3.1_DS_bars + labs(x="", y="Shoot - Dry Weight (mg)")
set_3.1_DS_bars <- set_3.1_DS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.1_DS_bars <- set_3.1_DS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.1_DS_bars <- set_3.1_DS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.1_DS_bars <- set_3.1_DS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,45))
#set_3.1_DS_bars <- set_3.1_DS_bars + geom_text(aes(x=isolate[18], y=814, label="233%"), hjust=0.38)
set_3.1_DS_bars <- set_3.1_DS_bars + geom_text(aes(x=isolate[33], y=36, label="277%"), hjust=0.38)
set_3.1_DS_bars

Dry Root

# ggplot with bars
## remove isoaltes with NA values
stat_s3.1_DR_complete <- stat_set_3.1_DR[complete.cases(stat_set_3.1_DR),]
## set the control value for Dry Shoot mg
set_3.1_DR_control_int <- as.numeric(stat_s3.1_DR_complete[36,5])
## calculate % control for each treatment
stat_s3.1_DR_complete$control <- as.numeric(stat_s3.1_DR_complete[36,5])
stat_s3.1_DR_complete <- mutate(stat_s3.1_DR_complete, p_ctrl = (100* (Average / control)))
set_3.1_DR_bars <- ggplot(stat_s3.1_DR_complete, aes(x = isolate, y = Average))
set_3.1_DR_bars <- set_3.1_DR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_3.1_DR_bars <- set_3.1_DR_bars + geom_hline(aes(yintercept=set_3.1_DR_control_int), colour="#990000", linetype="dashed")
set_3.1_DR_bars <- set_3.1_DR_bars + labs(x="", y="Root - Dry Weight (mg)")
set_3.1_DR_bars <- set_3.1_DR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.1_DR_bars <- set_3.1_DR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.1_DR_bars <- set_3.1_DR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.1_DR_bars <- set_3.1_DR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,7.9))
set_3.1_DR_bars <- set_3.1_DR_bars + geom_text(aes(x=isolate[18], y=6, label="211%"), hjust=0.38)
set_3.1_DR_bars <- set_3.1_DR_bars + geom_text(aes(x=isolate[23], y=7.7, label="250%"), hjust=0.38)
set_3.1_DR_bars

Cowplot - Set 3.1 - Full

set_3.1_dry_grid <- plot_grid(set_3.1_DS_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_3.1_DR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("C", "D"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_3.1_full_grid <- plot_grid(set_3.1_wet_grid,
                             set_3.1_dry_grid,
                             ncol = 2)
set_3.1_full_grid

ggsave("./Plots/set_3.1_full_grid.pdf", set_3.1_full_grid, width = 16, height = 16)

Set 3.2

Dry Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s3.2_DS_complete <- stat_set_3.2_DS[complete.cases(stat_set_3.2_DS),]
## set the control value for Dry Shoot mg
set_3.2_DS_control_int <- as.numeric(stat_s3.2_DS_complete[24,5])
## calculate % control for each treatment
stat_s3.2_DS_complete$control <- as.numeric(stat_s3.2_DS_complete[24,5])
stat_s3.2_DS_complete <- mutate(stat_s3.2_DS_complete, p_ctrl = (100* (Average / control)))
set_3.2_DS_bars <- ggplot(stat_s3.2_DS_complete, aes(x = isolate, y = Average))
set_3.2_DS_bars <- set_3.2_DS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_3.2_DS_bars <- set_3.2_DS_bars + geom_hline(aes(yintercept=set_3.2_DS_control_int), colour="#990000", linetype="dashed")
set_3.2_DS_bars <- set_3.2_DS_bars + labs(x="", y="Shoot - Dry Weight (mg)")
set_3.2_DS_bars <- set_3.2_DS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.2_DS_bars <- set_3.2_DS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.2_DS_bars <- set_3.2_DS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.2_DS_bars <- set_3.2_DS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,29))
set_3.2_DS_bars

Dry Root

# ggplot with bars
## remove isoaltes with NA values
stat_s3.2_DR_complete <- stat_set_3.2_DR[complete.cases(stat_set_3.2_DR),]
## set the control value for Dry Shoot mg
set_3.2_DR_control_int <- as.numeric(stat_s3.2_DR_complete[24,5])
## calculate % control for each treatment
stat_s3.2_DR_complete$control <- as.numeric(stat_s3.2_DR_complete[24,5])
stat_s3.2_DR_complete <- mutate(stat_s3.2_DR_complete, p_ctrl = (100* (Average / control)))
set_3.2_DR_bars <- ggplot(stat_s3.2_DR_complete, aes(x = isolate, y = Average))
set_3.2_DR_bars <- set_3.2_DR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_3.2_DR_bars <- set_3.2_DR_bars + geom_hline(aes(yintercept=set_3.2_DR_control_int), colour="#990000", linetype="dashed")
set_3.2_DR_bars <- set_3.2_DR_bars + labs(x="", y="Root - Dry Weight (mg)")
set_3.2_DR_bars <- set_3.2_DR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.2_DR_bars <- set_3.2_DR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.2_DR_bars <- set_3.2_DR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.2_DR_bars <- set_3.2_DR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,7.9))
#set_3.2_DR_bars <- set_3.2_DR_bars + geom_text(aes(x=isolate[18], y=6, label="211%"), hjust=0.38)
#set_3.2_DR_bars <- set_3.2_DR_bars + geom_text(aes(x=isolate[23], y=7.7, label="250%"), hjust=0.38)
set_3.2_DR_bars

Cowplot - Set 3.2 - Full

set_3.2_dry_grid <- plot_grid(set_3.2_DS_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_3.2_DR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("C", "D"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_3.2_full_grid <- plot_grid(set_3.2_wet_grid,
                             set_3.2_dry_grid,
                             ncol = 2)
set_3.2_full_grid

ggsave("./Plots/set_3.2_full_grid.pdf", set_3.2_full_grid, width = 16, height = 16)

Set 3.3

Dry Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s3.3_DS_complete <- stat_set_3.3_DS[complete.cases(stat_set_3.3_DS),]
## set the control value for Dry Shoot mg
set_3.3_DS_control_int <- as.numeric(stat_s3.3_DS_complete[37,5])
## calculate % control for each treatment
stat_s3.3_DS_complete$control <- as.numeric(stat_s3.3_DS_complete[37,5])
stat_s3.3_DS_complete <- mutate(stat_s3.3_DS_complete, p_ctrl = (100* (Average / control)))
set_3.3_DS_bars <- ggplot(stat_s3.3_DS_complete, aes(x = isolate, y = Average))
set_3.3_DS_bars <- set_3.3_DS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_3.3_DS_bars <- set_3.3_DS_bars + geom_hline(aes(yintercept=set_3.3_DS_control_int), colour="#990000", linetype="dashed")
set_3.3_DS_bars <- set_3.3_DS_bars + labs(x="", y="Shoot - Dry Weight (mg)")
set_3.3_DS_bars <- set_3.3_DS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.3_DS_bars <- set_3.3_DS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.3_DS_bars <- set_3.3_DS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.3_DS_bars <- set_3.3_DS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,49))
set_3.3_DS_bars

Dry Root

# ggplot with bars
## remove isoaltes with NA values
stat_s3.3_DR_complete <- stat_set_3.3_DR[complete.cases(stat_set_3.3_DR),]
## set the control value for Dry Shoot mg
set_3.3_DR_control_int <- as.numeric(stat_s3.3_DR_complete[37,5])
## calculate % control for each treatment
stat_s3.3_DR_complete$control <- as.numeric(stat_s3.3_DR_complete[37,5])
stat_s3.3_DR_complete <- mutate(stat_s3.3_DR_complete, p_ctrl = (100* (Average / control)))
set_3.3_DR_bars <- ggplot(stat_s3.3_DR_complete, aes(x = isolate, y = Average))
set_3.3_DR_bars <- set_3.3_DR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_3.3_DR_bars <- set_3.3_DR_bars + geom_hline(aes(yintercept=set_3.3_DR_control_int), colour="#990000", linetype="dashed")
set_3.3_DR_bars <- set_3.3_DR_bars + labs(x="", y="Root - Dry Weight (mg)")
set_3.3_DR_bars <- set_3.3_DR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.3_DR_bars <- set_3.3_DR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.3_DR_bars <- set_3.3_DR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.3_DR_bars <- set_3.3_DR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,8.9))
set_3.3_DR_bars

Cowplot - Set 3.3 - Full

set_3.3_dry_grid <- plot_grid(set_3.3_DS_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_3.3_DR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("C", "D"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_3.3_full_grid <- plot_grid(set_3.3_wet_grid,
                             set_3.3_dry_grid,
                             ncol = 2)
set_3.3_full_grid

ggsave("./Plots/set_3.3_full_grid.pdf", set_3.3_full_grid, width = 16, height = 16)

Set 3.4

Dry Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s3.4_DS_complete <- stat_set_3.4_DS[complete.cases(stat_set_3.4_DS),]
## set the control value for Dry Shoot mg
set_3.4_DS_control_int <- as.numeric(stat_s3.4_DS_complete[36,5])
## calculate % control for each treatment
stat_s3.4_DS_complete$control <- as.numeric(stat_s3.4_DS_complete[36,5])
stat_s3.4_DS_complete <- mutate(stat_s3.4_DS_complete, p_ctrl = (100* (Average / control)))
set_3.4_DS_bars <- ggplot(stat_s3.4_DS_complete, aes(x = isolate, y = Average))
set_3.4_DS_bars <- set_3.4_DS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_3.4_DS_bars <- set_3.4_DS_bars + geom_hline(aes(yintercept=set_3.4_DS_control_int), colour="#990000", linetype="dashed")
set_3.4_DS_bars <- set_3.4_DS_bars + labs(x="", y="Shoot - Dry Weight (mg)")
set_3.4_DS_bars <- set_3.4_DS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.4_DS_bars <- set_3.4_DS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.4_DS_bars <- set_3.4_DS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.4_DS_bars <- set_3.4_DS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,35))
set_3.4_DS_bars <- set_3.4_DS_bars + geom_text(aes(x=isolate[17], y=31.5, label="150%"), hjust=0.38)
set_3.4_DS_bars

Dry Root

# ggplot with bars
## remove isoaltes with NA values
stat_s3.4_DR_complete <- stat_set_3.4_DR[complete.cases(stat_set_3.4_DR),]
## set the control value for Dry Shoot mg
set_3.4_DR_control_int <- as.numeric(stat_s3.4_DR_complete[36,5])
## calculate % control for each treatment
stat_s3.4_DR_complete$control <- as.numeric(stat_s3.4_DR_complete[36,5])
stat_s3.4_DR_complete <- mutate(stat_s3.4_DR_complete, p_ctrl = (100* (Average / control)))
set_3.4_DR_bars <- ggplot(stat_s3.4_DR_complete, aes(x = isolate, y = Average))
set_3.4_DR_bars <- set_3.4_DR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_3.4_DR_bars <- set_3.4_DR_bars + geom_hline(aes(yintercept=set_3.4_DR_control_int), colour="#990000", linetype="dashed")
set_3.4_DR_bars <- set_3.4_DR_bars + labs(x="", y="Root - Dry Weight (mg)")
set_3.4_DR_bars <- set_3.4_DR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.4_DR_bars <- set_3.4_DR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.4_DR_bars <- set_3.4_DR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.4_DR_bars <- set_3.4_DR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,8.9))
set_3.4_DR_bars <- set_3.4_DR_bars + geom_text(aes(x=isolate[6], y=6.3, label="134%"), hjust=0.38)
set_3.4_DR_bars

Cowplot - Set 3.4 - Full

set_3.4_dry_grid <- plot_grid(set_3.4_DS_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_3.4_DR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("C", "D"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_3.4_full_grid <- plot_grid(set_3.4_wet_grid,
                             set_3.4_dry_grid,
                             ncol = 2)
set_3.4_full_grid

ggsave("./Plots/set_3.4_full_grid.pdf", set_3.4_full_grid, width = 16, height = 16)

Set 3.5

Dry Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s3.5_DS_complete <- stat_set_3.5_DS[complete.cases(stat_set_3.5_DS),]
## set the control value for Dry Shoot mg
set_3.5_DS_control_int <- as.numeric(stat_s3.5_DS_complete[20,5])
## calculate % control for each treatment
stat_s3.5_DS_complete$control <- as.numeric(stat_s3.5_DS_complete[20,5])
stat_s3.5_DS_complete <- mutate(stat_s3.5_DS_complete, p_ctrl = (100* (Average / control)))
set_3.5_DS_bars <- ggplot(stat_s3.5_DS_complete, aes(x = isolate, y = Average))
set_3.5_DS_bars <- set_3.5_DS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_3.5_DS_bars <- set_3.5_DS_bars + geom_hline(aes(yintercept=set_3.5_DS_control_int), colour="#990000", linetype="dashed")
set_3.5_DS_bars <- set_3.5_DS_bars + labs(x="", y="Shoot - Dry Weight (mg)")
set_3.5_DS_bars <- set_3.5_DS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.5_DS_bars <- set_3.5_DS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.5_DS_bars <- set_3.5_DS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.5_DS_bars <- set_3.5_DS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,29))
set_3.5_DS_bars <- set_3.5_DS_bars + geom_text(aes(x=isolate[11], y=27, label="150%"), hjust=0.38)
set_3.5_DS_bars

Dry Root

# ggplot with bars
## remove isoaltes with NA values
stat_s3.5_DR_complete <- stat_set_3.5_DR[complete.cases(stat_set_3.5_DR),]
## set the control value for Dry Shoot mg
set_3.5_DR_control_int <- as.numeric(stat_s3.5_DR_complete[20,5])
## calculate % control for each treatment
stat_s3.5_DR_complete$control <- as.numeric(stat_s3.5_DR_complete[20,5])
stat_s3.5_DR_complete <- mutate(stat_s3.5_DR_complete, p_ctrl = (100* (Average / control)))
set_3.5_DR_bars <- ggplot(stat_s3.5_DR_complete, aes(x = isolate, y = Average))
set_3.5_DR_bars <- set_3.5_DR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_3.5_DR_bars <- set_3.5_DR_bars + geom_hline(aes(yintercept=set_3.5_DR_control_int), colour="#990000", linetype="dashed")
set_3.5_DR_bars <- set_3.5_DR_bars + labs(x="", y="Root - Dry Weight (mg)")
set_3.5_DR_bars <- set_3.5_DR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_3.5_DR_bars <- set_3.5_DR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_3.5_DR_bars <- set_3.5_DR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_3.5_DR_bars <- set_3.5_DR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,5.7))
set_3.5_DR_bars

Cowplot - Set 3.5 - Full

set_3.5_dry_grid <- plot_grid(set_3.5_DS_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_3.5_DR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("C", "D"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_3.5_full_grid <- plot_grid(set_3.5_wet_grid,
                             set_3.5_dry_grid,
                             ncol = 2)
set_3.5_full_grid

ggsave("./Plots/set_3.5_full_grid.pdf", set_3.5_full_grid, width = 16, height = 16)

Set 4.1

Dry Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s4.1_DS_complete <- stat_set_4.1_DS[complete.cases(stat_set_4.1_DS),]
## set the control value for Dry Shoot mg
set_4.1_DS_control_int <- as.numeric(stat_s4.1_DS_complete[37,5])
## calculate % control for each treatment
stat_s4.1_DS_complete$control <- as.numeric(stat_s4.1_DS_complete[37,5])
stat_s4.1_DS_complete <- mutate(stat_s4.1_DS_complete, p_ctrl = (100* (Average / control)))
set_4.1_DS_bars <- ggplot(stat_s4.1_DS_complete, aes(x = isolate, y = Average))
set_4.1_DS_bars <- set_4.1_DS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_4.1_DS_bars <- set_4.1_DS_bars + geom_hline(aes(yintercept=set_4.1_DS_control_int), colour="#990000", linetype="dashed")
set_4.1_DS_bars <- set_4.1_DS_bars + labs(x="", y="Shoot - Dry Weight (mg)")
set_4.1_DS_bars <- set_4.1_DS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_4.1_DS_bars <- set_4.1_DS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_4.1_DS_bars <- set_4.1_DS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_4.1_DS_bars <- set_4.1_DS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,45))
set_4.1_DS_bars <- set_4.1_DS_bars + geom_text(aes(x=isolate[16], y=37, label="165%"), hjust=0.38)
set_4.1_DS_bars <- set_4.1_DS_bars + geom_text(aes(x=isolate[25], y=42, label="180%"), hjust=0.38)
set_4.1_DS_bars

Dry Root

# ggplot with bars
## remove isoaltes with NA values
stat_s4.1_DR_complete <- stat_set_4.1_DR[complete.cases(stat_set_4.1_DR),]
## set the control value for Dry Shoot mg
set_4.1_DR_control_int <- as.numeric(stat_s4.1_DR_complete[37,5])
## calculate % control for each treatment
stat_s4.1_DR_complete$control <- as.numeric(stat_s4.1_DR_complete[37,5])
stat_s4.1_DR_complete <- mutate(stat_s4.1_DR_complete, p_ctrl = (100* (Average / control)))
set_4.1_DR_bars <- ggplot(stat_s4.1_DR_complete, aes(x = isolate, y = Average))
set_4.1_DR_bars <- set_4.1_DR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_4.1_DR_bars <- set_4.1_DR_bars + geom_hline(aes(yintercept=set_4.1_DR_control_int), colour="#990000", linetype="dashed")
set_4.1_DR_bars <- set_4.1_DR_bars + labs(x="", y="Root - Dry Weight (mg)")
set_4.1_DR_bars <- set_4.1_DR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_4.1_DR_bars <- set_4.1_DR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_4.1_DR_bars <- set_4.1_DR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_4.1_DR_bars <- set_4.1_DR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,5.7))
set_4.1_DR_bars

Cowplot - Set 4.1 - Full

set_4.1_dry_grid <- plot_grid(set_4.1_DS_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_4.1_DR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("C", "D"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_4.1_full_grid <- plot_grid(set_4.1_wet_grid,
                             set_4.1_dry_grid,
                             ncol = 2)
set_4.1_full_grid

ggsave("./Plots/set_4.1_full_grid.pdf", set_4.1_full_grid, width = 16, height = 16)

Set 4.2

Dry Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s4.2_DS_complete <- stat_set_4.2_DS[complete.cases(stat_set_4.2_DS),]
## set the control value for Dry Shoot mg
set_4.2_DS_control_int <- as.numeric(stat_s4.2_DS_complete[23,5])
## calculate % control for each treatment
stat_s4.2_DS_complete$control <- as.numeric(stat_s4.2_DS_complete[23,5])
stat_s4.2_DS_complete <- mutate(stat_s4.2_DS_complete, p_ctrl = (100* (Average / control)))
set_4.2_DS_bars <- ggplot(stat_s4.2_DS_complete, aes(x = isolate, y = Average))
set_4.2_DS_bars <- set_4.2_DS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_4.2_DS_bars <- set_4.2_DS_bars + geom_hline(aes(yintercept=set_4.2_DS_control_int), colour="#990000", linetype="dashed")
set_4.2_DS_bars <- set_4.2_DS_bars + labs(x="", y="Shoot - Dry Weight (mg)")
set_4.2_DS_bars <- set_4.2_DS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_4.2_DS_bars <- set_4.2_DS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_4.2_DS_bars <- set_4.2_DS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_4.2_DS_bars <- set_4.2_DS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,52))
set_4.2_DS_bars <- set_4.2_DS_bars + geom_text(aes(x=isolate[8], y=42, label="242%"), hjust=0.38)
set_4.2_DS_bars <- set_4.2_DS_bars + geom_text(aes(x=isolate[17], y=38, label="203%"), hjust=0.38)
set_4.2_DS_bars

Dry Root

# ggplot with bars
## remove isoaltes with NA values
stat_s4.2_DR_complete <- stat_set_4.2_DR[complete.cases(stat_set_4.2_DR),]
## set the control value for Dry Shoot mg
set_4.2_DR_control_int <- as.numeric(stat_s4.2_DR_complete[23,5])
## calculate % control for each treatment
stat_s4.2_DR_complete$control <- as.numeric(stat_s4.2_DR_complete[23,5])
stat_s4.2_DR_complete <- mutate(stat_s4.2_DR_complete, p_ctrl = (100* (Average / control)))
set_4.2_DR_bars <- ggplot(stat_s4.2_DR_complete, aes(x = isolate, y = Average))
set_4.2_DR_bars <- set_4.2_DR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_4.2_DR_bars <- set_4.2_DR_bars + geom_hline(aes(yintercept=set_4.2_DR_control_int), colour="#990000", linetype="dashed")
set_4.2_DR_bars <- set_4.2_DR_bars + labs(x="", y="Root - Dry Weight (mg)")
set_4.2_DR_bars <- set_4.2_DR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_4.2_DR_bars <- set_4.2_DR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_4.2_DR_bars <- set_4.2_DR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_4.2_DR_bars <- set_4.2_DR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,5.7))
set_4.2_DR_bars <- set_4.2_DR_bars + geom_text(aes(x=isolate[6], y=4.5, label="392%"), hjust=0.38)
set_4.2_DR_bars <- set_4.2_DR_bars + geom_text(aes(x=isolate[8], y=4.7, label="420%"), hjust=0.38)
set_4.2_DR_bars

Cowplot - Set 4.2 - Full

set_4.2_dry_grid <- plot_grid(set_4.2_DS_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_4.2_DR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("C", "D"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_4.2_full_grid <- plot_grid(set_4.2_wet_grid,
                             set_4.2_dry_grid,
                             ncol = 2)
set_4.2_full_grid

ggsave("./Plots/set_4.2_full_grid.pdf", set_4.2_full_grid, width = 16, height = 16)

Set 4.3

Dry Shoot

# ggplot with bars
## remove isoaltes with NA values
stat_s4.3_DS_complete <- stat_set_4.3_DS[complete.cases(stat_set_4.3_DS),]
## set the control value for Dry Shoot mg
set_4.3_DS_control_int <- as.numeric(stat_s4.3_DS_complete[25,5])
## calculate % control for each treatment
stat_s4.3_DS_complete$control <- as.numeric(stat_s4.3_DS_complete[25,5])
stat_s4.3_DS_complete <- mutate(stat_s4.3_DS_complete, p_ctrl = (100* (Average / control)))
set_4.3_DS_bars <- ggplot(stat_s4.3_DS_complete, aes(x = isolate, y = Average))
set_4.3_DS_bars <- set_4.3_DS_bars + geom_bar(stat = "identity", size=.5, fill="lightgreen")
set_4.3_DS_bars <- set_4.3_DS_bars + geom_hline(aes(yintercept=set_4.3_DS_control_int), colour="#990000", linetype="dashed")
set_4.3_DS_bars <- set_4.3_DS_bars + labs(x="", y="Shoot - Dry Weight (mg)")
set_4.3_DS_bars <- set_4.3_DS_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_4.3_DS_bars <- set_4.3_DS_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_4.3_DS_bars <- set_4.3_DS_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_4.3_DS_bars <- set_4.3_DS_bars + scale_y_continuous(expand = c(0,0), limits = c(0,35))
set_4.3_DS_bars

Dry Root

# ggplot with bars
## remove isoaltes with NA values
stat_s4.3_DR_complete <- stat_set_4.3_DR[complete.cases(stat_set_4.3_DR),]
## set the control value for Dry Shoot mg
set_4.3_DR_control_int <- as.numeric(stat_s4.3_DR_complete[25,5])
## calculate % control for each treatment
stat_s4.3_DR_complete$control <- as.numeric(stat_s4.3_DR_complete[25,5])
stat_s4.3_DR_complete <- mutate(stat_s4.3_DR_complete, p_ctrl = (100* (Average / control)))
set_4.3_DR_bars <- ggplot(stat_s4.3_DR_complete, aes(x = isolate, y = Average))
set_4.3_DR_bars <- set_4.3_DR_bars + geom_bar(stat = "identity", size=.5, fill="tan")
set_4.3_DR_bars <- set_4.3_DR_bars + geom_hline(aes(yintercept=set_4.3_DR_control_int), colour="#990000", linetype="dashed")
set_4.3_DR_bars <- set_4.3_DR_bars + labs(x="", y="Root - Dry Weight (mg)")
set_4.3_DR_bars <- set_4.3_DR_bars + geom_errorbar(aes(ymin=Average-SE, ymax=Average+SE), size=.5, width=.2)
set_4.3_DR_bars <- set_4.3_DR_bars + theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 12),
                                       axis.text.y = element_text(size = 12),
                                       axis.title.x = element_blank(),
                                       axis.title.y = element_text(size = 14),
                                       legend.text = element_text(size = 16),
                                       legend.title = element_text(size = 16))
set_4.3_DR_bars <- set_4.3_DR_bars + scale_x_discrete(position = "bottom", expand = c(0,0))
set_4.3_DR_bars <- set_4.3_DR_bars + scale_y_continuous(expand = c(0,0), limits = c(0,3.9))
set_4.3_DR_bars

Cowplot - Set 4.3 - Full

set_4.3_dry_grid <- plot_grid(set_4.3_DS_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            set_4.3_DR_bars + theme(plot.margin = unit(c(.1,.1,.1,.1), "cm")),
                            labels = c("C", "D"),
                            label_size = 24,
                            nrow = 2,
                            ncol = 1,
                            align = 'vh')
set_4.3_full_grid <- plot_grid(set_4.3_wet_grid,
                             set_4.3_dry_grid,
                             ncol = 2)
set_4.3_full_grid

ggsave("./Plots/set_4.3_full_grid.pdf", set_4.3_full_grid, width = 16, height = 16)

Table 2

Statistically Significant Isolates based on Wet Weight Measruements

Create Master Dataframe of Plot Weights

# Create lists of dfs for wet shoot complete cases
wet_shoot_stat_list <- mget(ls(pattern = "stat_.+_WS_complete"))
wet_root_stat_list <- mget(ls(pattern = "stat_.+_WR_complete"))
dry_shoot_stat_list <- mget(ls(pattern = "stat_.+_DS_complete"))
dry_root_stat_list <- mget(ls(pattern = "stat_.+_DR_complete"))
## Bind rows
wet_shoot_master <- bind_rows(wet_shoot_stat_list)
wet_root_master <- bind_rows(wet_root_stat_list)
dry_shoot_master <- bind_rows(dry_shoot_stat_list)
dry_root_master <- bind_rows(dry_root_stat_list)

create master dataframe of lsmeans_data for each sample type

trt.vs.control

p-value correction for multiple testing using DunnettX method

confidence level used = 0.95 or alpha = 0.05

Read in csv files

# Make lists of files for dataframes
## Dry Root files
paths.lsm.dun.DR <- list.files(path = "./lsmeans_summary_tables/", pattern = "*.DR.csv", recursive = T, full.names = T)
## Dry Shoot files
paths.lsm.dun.DS <- list.files(path = "./lsmeans_summary_tables/", pattern = "*.DS.csv", recursive = T, full.names = T)
## Wet Root files
paths.lsm.dun.WR <- list.files(path = "./lsmeans_summary_tables/", pattern = "*.WR.csv", recursive = T, full.names = T)
## Wet Shoot files
paths.lsm.dun.WS <- list.files(path = "./lsmeans_summary_tables/", pattern = "*.WS.csv", recursive = T, full.names = T)
# Read in lists of DR files
list.lsm.dun.DR <- lapply(paths.lsm.dun.DR, read_csv)
# Read in lists of DS files
list.lsm.dun.DS <- lapply(paths.lsm.dun.DS, read_csv)
# Read in lists of WR files
list.lsm.dun.WR <- lapply(paths.lsm.dun.WR, read_csv)
# Read in lists of WS files
list.lsm.dun.WS <- lapply(paths.lsm.dun.WS, read_csv)

Bind Rows

Make a master dataframe

# Dry Roots
lsm.dun.DR.master <- bind_rows(list.lsm.dun.DR)
# Dry Shoots
lsm.dun.DS.master <- bind_rows(list.lsm.dun.DS)
# Wet Roots
lsm.dun.WR.master <- bind_rows(list.lsm.dun.WR)
# Wet Shoots
lsm.dun.WS.master <- bind_rows(list.lsm.dun.WS)

Add Isolate names and response type

# Dry Roots
## Extract Isolate ID from contrast variable
lsm.dun.DR.master <- lsm.dun.DR.master %>% 
  extract(contrast, into = "Isolate", regex = "(^[0-9]+)", remove = FALSE)
## Create BCW-ID variable
lsm.dun.DR.master <- lsm.dun.DR.master %>% 
  mutate("BCW-ID" = paste0("BCW-", Isolate)) %>%
  mutate("Response" = "Dry Root")
# Dry Shoots
## Extract Isolate ID from contrast variable
lsm.dun.DS.master <- lsm.dun.DS.master %>% 
  extract(contrast, into = "Isolate", regex = "(^[0-9]+)", remove = FALSE)
## Create BCW-ID variable
lsm.dun.DS.master <- lsm.dun.DS.master %>%
  mutate("BCW-ID" = paste0("BCW-", Isolate)) %>%
  mutate("Response" = "Dry Shoot")
# Wet Roots
## Extract Isolate ID from contrast variable
lsm.dun.WR.master <- lsm.dun.WR.master %>% 
  extract(contrast, into = "Isolate", regex = "(^[0-9]+)", remove = FALSE)
## Create BCW-ID variable
lsm.dun.WR.master <- lsm.dun.WR.master %>%
  mutate("BCW-ID" = paste0("BCW-", Isolate)) %>%
  mutate("Response" = "Fresh Root")
# Wet Shoots
## Extract Isolate ID from contrast variable
lsm.dun.WS.master <- lsm.dun.WS.master %>% 
  extract(contrast, into = "Isolate", regex = "(^[0-9]+)", remove = FALSE)
## Create BCW-ID variable
lsm.dun.WS.master <- lsm.dun.WS.master %>%
  mutate("BCW-ID" = paste0("BCW-", Isolate)) %>%
  mutate("Response" = "Fresh Shoot")

Add Percent Control Variable

# Dry Root
lsm.dun.DR.master$p_control <- dry_root_master$p_ctrl[match(lsm.dun.DR.master$Isolate,
                                                            dry_root_master$isolate)]
# Dry Shoot
lsm.dun.DS.master$p_control <- dry_shoot_master$p_ctrl[match(lsm.dun.DS.master$Isolate,
                                                            dry_shoot_master$isolate)]
# Wet Root
lsm.dun.WR.master$p_control <- wet_root_master$p_ctrl[match(lsm.dun.WR.master$Isolate,
                                                            wet_root_master$isolate)]
# Wet Shoot
lsm.dun.WS.master$p_control <- wet_shoot_master$p_ctrl[match(lsm.dun.WS.master$Isolate,
                                                            wet_shoot_master$isolate)]

Select variables and filter

# Wet Shoot
t2.WS.master <- lsm.dun.WS.master %>%
  select(`BCW-ID`, estimate, SE, p.value, Response, p_control) %>%
  filter(p_control > 100 &
           p.value < 0.1 &
           estimate > 0)
# Wet Root
t2.WR.master <- lsm.dun.WR.master %>%
  select(`BCW-ID`, estimate, SE, p.value, Response, p_control) %>%
  filter(p_control > 100 &
           p.value < 0.1 &
           estimate > 0)
# Dry Shoot
t2.DS.master <- lsm.dun.DS.master %>%
  select(`BCW-ID`, estimate, SE, p.value, Response, p_control) %>%
  filter(p_control > 100 &
           p.value < 0.1 &
           estimate > 0)
# Dry Root
t2.DR.master <- lsm.dun.DR.master %>%
  select(`BCW-ID`, estimate, SE, p.value, Response, p_control) %>%
  filter(p_control > 100 &
           p.value < 0.1 &
           estimate > 0)
# Combine
t2_list_master <- mget(ls(pattern = "t2.*.master"))
t2.master <- bind_rows(t2_list_master)

Add Genus info

# read in abb to bcw map file
abb_bcw_labels <- read_csv("./metadata/abb_genome_bcw_labels.csv", col_names = TRUE)
Parsed with column specification:
cols(
  BCW_ID = col_character(),
  ABB_ID = col_character()
)
abb_bcw_labels$BCW_ID <- sub("_", "-", abb_bcw_labels$BCW_ID)
# read in sourmash lca data of whole genome signatures
sourmash_lca <- read_csv("./metadata/lca-classify-all-k31-gtdb89.csv", col_names = TRUE)
Parsed with column specification:
cols(
  ID = col_character(),
  status = col_character(),
  superkingdom = col_character(),
  phylum = col_character(),
  class = col_character(),
  order = col_character(),
  family = col_character(),
  genus = col_character(),
  species = col_character(),
  strain = col_logical()
)
## empty cells are 'unassigned'
sourmash_lca <- sourmash_lca %>%
  replace(., is.na(.), "Unassigned")
Error: Assigned data `values` must be compatible with existing data.
ℹ Error occurred for column `strain`.
x Can't convert <character> to <logical>.
Run `rlang::last_error()` to see where the error occurred.

rr t2.master.2 <- t2.master # Add Genus variable t2.master.2 <- t2.master.2 %>% full_join(sourmash_lca, by = c(-ID = )) %>% drop_na()

LS0tCnRpdGxlOiAiUG90YXRvIFBsYW50bGV0IElub2N1bGF0aW9uIEdyYXBocyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShjb3dwbG90KQpgYGAKCgojIEFkZCBCYXRjaCBJRCB0byBXZXQgV2VpZ2h0IERhdGFmcmFtZXMKYGBge3J9CiMgYWRkIGJhdGNoIGlkIHZhcmlhYmxlIHRvIGVhY2ggZGF0YXNldAoKIyMgU2V0IDEKIyMjIFdldCBTaG9vdApzZXRfMV9XU19pZCA8LSBzZXRfMV9XUwpzZXRfMV9XU19pZCRiYXRjaCA8LSBjKCJTZXQgMSIpCgojIyMgV2V0IFJvb3QKc2V0XzFfV1JfaWQgPC0gc2V0XzFfV1IKc2V0XzFfV1JfaWQkYmF0Y2ggPC0gYygiU2V0IDEiKQoKIyMgU2V0IDIuMQojIyMgV2V0IFNob290CnNldF8yLjFfV1NfaWQgPC0gc2V0XzIuMV9XUwpzZXRfMi4xX1dTX2lkJGJhdGNoIDwtIGMoIlNldCAyLjEiKQoKIyMjIFdldCBSb290CnNldF8yLjFfV1JfaWQgPC0gc2V0XzIuMV9XUgpzZXRfMi4xX1dSX2lkJGJhdGNoIDwtIGMoIlNldCAyLjEiKQoKIyMgU2V0IDIuMgojIyMgV2V0IFNob290CnNldF8yLjJfV1NfaWQgPC0gc2V0XzIuMl9XUwpzZXRfMi4yX1dTX2lkJGJhdGNoIDwtIGMoIlNldCAyLjIiKQoKIyMjIFdldCBSb290CnNldF8yLjJfV1JfaWQgPC0gc2V0XzIuMl9XUgpzZXRfMi4yX1dSX2lkJGJhdGNoIDwtIGMoIlNldCAyLjIiKQoKIyMgU2V0IDIuMwojIyMgV2V0IFNob290CnNldF8yLjNfV1NfaWQgPC0gc2V0XzIuM19XUwpzZXRfMi4zX1dTX2lkJGJhdGNoIDwtIGMoIlNldCAyLjMiKQoKIyMjIFdldCBSb290CnNldF8yLjNfV1JfaWQgPC0gc2V0XzIuM19XUgpzZXRfMi4zX1dSX2lkJGJhdGNoIDwtIGMoIlNldCAyLjMiKQoKIyMgU2V0IDIuNAojIyMgV2V0IFNob290CnNldF8yLjRfV1NfaWQgPC0gc2V0XzIuNF9XUwpzZXRfMi40X1dTX2lkJGJhdGNoIDwtIGMoIlNldCAyLjQiKQoKIyMjIFdldCBSb290CnNldF8yLjRfV1JfaWQgPC0gc2V0XzIuNF9XUgpzZXRfMi40X1dSX2lkJGJhdGNoIDwtIGMoIlNldCAyLjQiKQoKIyMgU2V0IDMuMQojIyMgV2V0IFNob290CnNldF8zLjFfV1NfaWQgPC0gc2V0XzMuMV9XUwpzZXRfMy4xX1dTX2lkJGJhdGNoIDwtIGMoIlNldCAzLjEiKQoKIyMjIFdldCBSb290CnNldF8zLjFfV1JfaWQgPC0gc2V0XzMuMV9XUgpzZXRfMy4xX1dSX2lkJGJhdGNoIDwtIGMoIlNldCAzLjEiKQoKIyMgU2V0IDMuMgojIyMgV2V0IFNob290CnNldF8zLjJfV1NfaWQgPC0gc2V0XzMuMl9XUwpzZXRfMy4yX1dTX2lkJGJhdGNoIDwtIGMoIlNldCAzLjIiKQoKIyMjIFdldCBSb290CnNldF8zLjJfV1JfaWQgPC0gc2V0XzMuMl9XUgpzZXRfMy4yX1dSX2lkJGJhdGNoIDwtIGMoIlNldCAzLjIiKQoKIyMgU2V0IDMuMwojIyMgV2V0IFNob290CnNldF8zLjNfV1NfaWQgPC0gc2V0XzMuM19XUwpzZXRfMy4zX1dTX2lkJGJhdGNoIDwtIGMoIlNldCAzLjMiKQoKIyMjIFdldCBSb290CnNldF8zLjNfV1JfaWQgPC0gc2V0XzMuM19XUgpzZXRfMy4zX1dSX2lkJGJhdGNoIDwtIGMoIlNldCAzLjMiKQoKIyMgU2V0IDMuNAojIyMgV2V0IFNob290CnNldF8zLjRfV1NfaWQgPC0gc2V0XzMuNF9XUwpzZXRfMy40X1dTX2lkJGJhdGNoIDwtIGMoIlNldCAzLjQiKQoKIyMjIFdldCBSb290CnNldF8zLjRfV1JfaWQgPC0gc2V0XzMuNF9XUgpzZXRfMy40X1dSX2lkJGJhdGNoIDwtIGMoIlNldCAzLjQiKQoKIyMgU2V0IDMuNQojIyMgV2V0IFNob290CnNldF8zLjVfV1NfaWQgPC0gc2V0XzMuNV9XUwpzZXRfMy41X1dTX2lkJGJhdGNoIDwtIGMoIlNldCAzLjUiKQoKIyMjIFdldCBSb290CnNldF8zLjVfV1JfaWQgPC0gc2V0XzMuNV9XUgpzZXRfMy41X1dSX2lkJGJhdGNoIDwtIGMoIlNldCAzLjUiKQoKIyMgU2V0IDQuMQojIyMgV2V0IFNob290CnNldF80LjFfV1NfaWQgPC0gc2V0XzQuMV9XUwpzZXRfNC4xX1dTX2lkJGJhdGNoIDwtIGMoIlNldCA0LjEiKQoKIyMjIFdldCBSb290CnNldF80LjFfV1JfaWQgPC0gc2V0XzQuMV9XUgpzZXRfNC4xX1dSX2lkJGJhdGNoIDwtIGMoIlNldCA0LjEiKQoKIyMgU2V0IDQuMgojIyMgV2V0IFNob290CnNldF80LjJfV1NfaWQgPC0gc2V0XzQuMl9XUwpzZXRfNC4yX1dTX2lkJGJhdGNoIDwtIGMoIlNldCA0LjIiKQoKIyMjIFdldCBSb290CnNldF80LjJfV1JfaWQgPC0gc2V0XzQuMl9XUgpzZXRfNC4yX1dSX2lkJGJhdGNoIDwtIGMoIlNldCA0LjIiKQoKIyMgU2V0IDQuMwojIyMgV2V0IFNob290CnNldF80LjNfV1NfaWQgPC0gc2V0XzQuM19XUwpzZXRfNC4zX1dTX2lkJGJhdGNoIDwtIGMoIlNldCA0LjMiKQoKIyMjIFdldCBSb290CnNldF80LjNfV1JfaWQgPC0gc2V0XzQuM19XUgpzZXRfNC4zX1dSX2lkJGJhdGNoIDwtIGMoIlNldCA0LjMiKQpgYGAKCiMgR3JvdXAgdGhlIERhdGEgZm9yIFBsb3R0aW5nCmBgYHtyfQojR3JvdXAgdGhlIGRhdGFzZXRzIGJhc2VkIG9uIFNhbXBsZSBJRCBhbmQgcHJlcCBtZXRob2QKCiMjIFNldCAxCnNldF8xX1dTX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzFfV1NfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCnNldF8xX1dSX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzFfV1JfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCgojIyBTZXQgMi4xCnNldF8yLjFfV1NfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfMi4xX1dTX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQpzZXRfMi4xX1dSX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzIuMV9XUl9pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKCiMjIFNldCAyLjIKc2V0XzIuMl9XU19ncm91cGVkIDwtIGdyb3VwX2J5KHNldF8yLjJfV1NfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCnNldF8yLjJfV1JfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfMi4yX1dSX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQoKIyMgU2V0IDIuMwpzZXRfMi4zX1dTX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzIuM19XU19pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKc2V0XzIuM19XUl9ncm91cGVkIDwtIGdyb3VwX2J5KHNldF8yLjNfV1JfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCgojIyBTZXQgMi40CnNldF8yLjRfV1NfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfMi40X1dTX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQpzZXRfMi40X1dSX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzIuNF9XUl9pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKCiMjIFNldCAzLjEKc2V0XzMuMV9XU19ncm91cGVkIDwtIGdyb3VwX2J5KHNldF8zLjFfV1NfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCnNldF8zLjFfV1JfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfMy4xX1dSX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQoKIyMgU2V0IDMuMgpzZXRfMy4yX1dTX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzMuMl9XU19pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKc2V0XzMuMl9XUl9ncm91cGVkIDwtIGdyb3VwX2J5KHNldF8zLjJfV1JfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCgojIyBTZXQgMy4zCnNldF8zLjNfV1NfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfMy4zX1dTX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQpzZXRfMy4zX1dSX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzMuM19XUl9pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKCiMjIFNldCAzLjQKc2V0XzMuNF9XU19ncm91cGVkIDwtIGdyb3VwX2J5KHNldF8zLjRfV1NfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCnNldF8zLjRfV1JfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfMy40X1dSX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQoKIyMgU2V0IDMuNQpzZXRfMy41X1dTX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzMuNV9XU19pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKc2V0XzMuNV9XUl9ncm91cGVkIDwtIGdyb3VwX2J5KHNldF8zLjVfV1JfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCgojIyBTZXQgNC4xCnNldF80LjFfV1NfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfNC4xX1dTX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQpzZXRfNC4xX1dSX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzQuMV9XUl9pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKCiMjIFNldCA0LjIKc2V0XzQuMl9XU19ncm91cGVkIDwtIGdyb3VwX2J5KHNldF80LjJfV1NfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCnNldF80LjJfV1JfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfNC4yX1dSX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQoKIyMgU2V0IDQuMwpzZXRfNC4zX1dTX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzQuM19XU19pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKc2V0XzQuM19XUl9ncm91cGVkIDwtIGdyb3VwX2J5KHNldF80LjNfV1JfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCmBgYAoKCiMgQ3JlYXRlIFN0YXRzIEZ1bmN0aW9ucwpgYGB7cn0KIyBDcmVhdGluZyBhIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgOTUlIENJIGZvciB0aGUgZGF0YSB2ZWN0b3IgdXNpbmcgYSB0LWRpc3RyaWJ1dGlvbgoKY29uZl9pbnQ5NSA8LSBmdW5jdGlvbihkYXRhKSB7CiAgICBuIDwtIGxlbmd0aChkYXRhKQogICAgZXJyb3IgPC0gcXQoMC45NzUsIGRmPW4tMSkgKiBzZChkYXRhLCBuYS5ybSA9IFRSVUUpL3NxcnQobikKICAgIHJldHVybihlcnJvcikKfQoKIyBDcmVhdGUgYSBmdW5jdGlvbiB0aGF0IGNhbGN1bGF0ZXMgdGhlIHN0YW5kYXJkIGVycm9yIGZvciB0aGUgZGF0YQoKc3RkX2Vycm9yIDwtIGZ1bmN0aW9uKGRhdGEpIHsKICBuIDwtIGxlbmd0aChkYXRhKQogIHNlIDwtIHNkKGRhdGEsIG5hLnJtID0gVFJVRSkvc3FydChuKQogIHJldHVybihzZSkKfQoKYGBgCgoKIyBDb21wdXRlIHN0YXRzIG92ZXIgdHJpcGxpY2F0ZXMgZm9yIHBsb3R0aW5nCmBgYHtyfQoKIyBzZXQgMQpzdGF0X3NldF8xX1dTIDwtIHN1bW1hcmlzZShzZXRfMV9XU19ncm91cGVkLCBOPWxlbmd0aChtZyksIEF2ZXJhZ2U9bWVhbihtZywgbmEucm0gPSBUUlVFKSwgQ0k5NT1jb25mX2ludDk1KG1nKSwgU0U9c3RkX2Vycm9yKG1nKSkKc3RhdF9zZXRfMV9XUiA8LSBzdW1tYXJpc2Uoc2V0XzFfV1JfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAyLjEKc3RhdF9zZXRfMi4xX1dTIDwtIHN1bW1hcmlzZShzZXRfMi4xX1dTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8yLjFfV1IgPC0gc3VtbWFyaXNlKHNldF8yLjFfV1JfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAyLjIKc3RhdF9zZXRfMi4yX1dTIDwtIHN1bW1hcmlzZShzZXRfMi4yX1dTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8yLjJfV1IgPC0gc3VtbWFyaXNlKHNldF8yLjJfV1JfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAyLjMKc3RhdF9zZXRfMi4zX1dTIDwtIHN1bW1hcmlzZShzZXRfMi4zX1dTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8yLjNfV1IgPC0gc3VtbWFyaXNlKHNldF8yLjNfV1JfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAyLjQKc3RhdF9zZXRfMi40X1dTIDwtIHN1bW1hcmlzZShzZXRfMi40X1dTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8yLjRfV1IgPC0gc3VtbWFyaXNlKHNldF8yLjRfV1JfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAzLjEKc3RhdF9zZXRfMy4xX1dTIDwtIHN1bW1hcmlzZShzZXRfMy4xX1dTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8zLjFfV1IgPC0gc3VtbWFyaXNlKHNldF8zLjFfV1JfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAzLjIKc3RhdF9zZXRfMy4yX1dTIDwtIHN1bW1hcmlzZShzZXRfMy4yX1dTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8zLjJfV1IgPC0gc3VtbWFyaXNlKHNldF8zLjJfV1JfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAzLjMKc3RhdF9zZXRfMy4zX1dTIDwtIHN1bW1hcmlzZShzZXRfMy4zX1dTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8zLjNfV1IgPC0gc3VtbWFyaXNlKHNldF8zLjNfV1JfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAzLjQKc3RhdF9zZXRfMy40X1dTIDwtIHN1bW1hcmlzZShzZXRfMy40X1dTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8zLjRfV1IgPC0gc3VtbWFyaXNlKHNldF8zLjRfV1JfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAzLjUKc3RhdF9zZXRfMy41X1dTIDwtIHN1bW1hcmlzZShzZXRfMy41X1dTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8zLjVfV1IgPC0gc3VtbWFyaXNlKHNldF8zLjVfV1JfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCA0LjEKc3RhdF9zZXRfNC4xX1dTIDwtIHN1bW1hcmlzZShzZXRfNC4xX1dTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF80LjFfV1IgPC0gc3VtbWFyaXNlKHNldF80LjFfV1JfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCA0LjIKc3RhdF9zZXRfNC4yX1dTIDwtIHN1bW1hcmlzZShzZXRfNC4yX1dTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF80LjJfV1IgPC0gc3VtbWFyaXNlKHNldF80LjJfV1JfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCA0LjMKc3RhdF9zZXRfNC4zX1dTIDwtIHN1bW1hcmlzZShzZXRfNC4zX1dTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF80LjNfV1IgPC0gc3VtbWFyaXNlKHNldF80LjNfV1JfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCmBgYAoKIyMgV2V0IFdlaWdodCBQbG90cwoKIyMjIFNldCAxCgojIyMjIFdldCBTaG9vdAoKIyMjIyMgV2l0aCBOQXMKCmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyBzZXQgdGhlIGNvbnRyb2wgdmFsdWUgZm9yIFdldCBTaG9vdCBtZwoKIyMgcmVtb3ZlIGNvbnRyb2wtV08KCnN0YXRfc2V0XzFfV1NfTkFzIDwtIGZpbHRlcihzdGF0X3NldF8xX1dTLCBpc29sYXRlICE9ICJjb250cm9sLVdPIikKCnNldF8xX1dTX2NvbnRyb2xfaW50IDwtIGFzLm51bWVyaWMoc3RhdF9zZXRfMV9XU1s1OCw1XSkKI3NldF8xX1dTX2NvbnRyb2xfaW50CnNldF8xX1dTX2JhcnNfTkEgPC0gZ2dwbG90KHN0YXRfc2V0XzFfV1NfTkFzLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzFfV1NfYmFyc19OQSA8LSBzZXRfMV9XU19iYXJzX05BICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9ImxpZ2h0Z3JlZW4iKQpzZXRfMV9XU19iYXJzX05BIDwtIHNldF8xX1dTX2JhcnNfTkEgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9c2V0XzFfV1NfY29udHJvbF9pbnQsIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfMV9XU19iYXJzX05BIDwtIHNldF8xX1dTX2JhcnNfTkEgKyBsYWJzKHg9IiIsIHk9IlNob290IC0gRnJlc2ggV2VpZ2h0IChtZykiKQpzZXRfMV9XU19iYXJzX05BIDwtIHNldF8xX1dTX2JhcnNfTkEgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQpzZXRfMV9XU19iYXJzX05BIDwtIHNldF8xX1dTX2JhcnNfTkEgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDc1LCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfMV9XU19iYXJzX05BIDwtIHNldF8xX1dTX2JhcnNfTkEgKyBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gImJvdHRvbSIsIGV4cGFuZCA9IGMoMCwwKSkKc2V0XzFfV1NfYmFyc19OQSA8LSBzZXRfMV9XU19iYXJzX05BICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkKc2V0XzFfV1NfYmFyc19OQSA8LSBzZXRfMV9XU19iYXJzX05BICsgZ2VvbV90ZXh0KGFlcyh4PTEsIHk9NjUwLCBsYWJlbD0iU3RyZXRjaCBpdCIpLCB2anVzdD0tMSkKc2V0XzFfV1NfYmFyc19OQQpgYGAKCiMjIyMjIFJlbW92ZWQgTkFzCmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKc3RhdF9zMV9XU19jb21wbGV0ZSA8LSBzdGF0X3NldF8xX1dTW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzFfV1MpLF0KCiMjIHJlbW92ZSBjb250cm9sLVdPCnN0YXRfczFfV1NfY29tcGxldGUgPC0gZmlsdGVyKHN0YXRfczFfV1NfY29tcGxldGUsIGlzb2xhdGUgIT0gImNvbnRyb2wtV08iKQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBXZXQgU2hvb3QgbWcKc2V0XzFfV1NfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MxX1dTX2NvbXBsZXRlWzM5LDVdKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zMV9XU19jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zMV9XU19jb21wbGV0ZVszOSw1XSkKCnN0YXRfczFfV1NfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczFfV1NfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKIyMgTWFrZSB0aGUgcGxvdApzZXRfMV9XU19iYXJzIDwtIGdncGxvdChzdGF0X3MxX1dTX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzFfV1NfYmFycyA8LSBzZXRfMV9XU19iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9ImxpZ2h0Z3JlZW4iKQpzZXRfMV9XU19iYXJzIDwtIHNldF8xX1dTX2JhcnMgKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PXNldF8xX1dTX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8xX1dTX2JhcnMgPC0gc2V0XzFfV1NfYmFycyArIGxhYnMoeD0iIiwgeT0iU2hvb3QgLSBGcmVzaCBXZWlnaHQgKG1nKSIpCnNldF8xX1dTX2JhcnMgPC0gc2V0XzFfV1NfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCiNzZXRfMV9XU19iYXJzIDwtIHNldF8xX1dTX2JhcnMgKyBnZW9tX3RleHQoYWVzKGxhYmVsPXNwcmludGYoIiUwLjBmIiwgcm91bmQocF9jdHJsLCBkaWdpdHMgPSAwKSksIHk9QXZlcmFnZStTRSwgdmp1c3Q9LTAuNSksIGhqdXN0ID0gMCwgYW5nbGUgPSA0NSkKc2V0XzFfV1NfYmFycyA8LSBzZXRfMV9XU19iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzFfV1NfYmFycyA8LSBzZXRfMV9XU19iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF8xX1dTX2JhcnMgPC0gc2V0XzFfV1NfYmFycyArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCw3MDApKQpzZXRfMV9XU19iYXJzIDwtIHNldF8xX1dTX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVsyNF0sIHk9NjQwLCBsYWJlbD0iMjA1JSIpLCBoanVzdD0wLjM4KQpzZXRfMV9XU19iYXJzIDwtIHNldF8xX1dTX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVsxMV0sIHk9NjAwLCBsYWJlbD0iMTg3JSIpLCBoanVzdD0wLjM4KQoKc2V0XzFfV1NfYmFycwpgYGAKCiMjIyMgV2V0IFJvb3QKCiMjIyMjIFdpdGggTkFzCgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgcmVtb3ZlIGNvbnRyb2wtV08Kc3RhdF9zZXRfMV9XUl9OQXMgPC0gZmlsdGVyKHN0YXRfc2V0XzFfV1IsIGlzb2xhdGUgIT0gImNvbnRyb2wtV08iKQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBXZXQgUm9vdCBtZwpzZXRfMV9XUl9jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfc2V0XzFfV1JbNTgsNV0pCgpzZXRfMV9XUl9iYXJzX05BIDwtIGdncGxvdChzdGF0X3NldF8xX1dSX05BcywgYWVzKHggPSBpc29sYXRlLCB5ID0gQXZlcmFnZSkpCnNldF8xX1dSX2JhcnNfTkEgPC0gc2V0XzFfV1JfYmFyc19OQSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJ0YW4iKQpzZXRfMV9XUl9iYXJzX05BIDwtIHNldF8xX1dSX2JhcnNfTkEgKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PXNldF8xX1dSX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8xX1dSX2JhcnNfTkEgPC0gc2V0XzFfV1JfYmFyc19OQSArIGxhYnMoeD0iIiwgeT0iUm9vdCAtIEZyZXNoIFdlaWdodCAobWcpIikKc2V0XzFfV1JfYmFyc19OQSA8LSBzZXRfMV9XUl9iYXJzX05BICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BdmVyYWdlLVNFLCB5bWF4PUF2ZXJhZ2UrU0UpLCBzaXplPS41LCB3aWR0aD0uMikKc2V0XzFfV1JfYmFyc19OQSA8LSBzZXRfMV9XUl9iYXJzX05BICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA3NSwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzFfV1JfYmFyc19OQSA8LSBzZXRfMV9XUl9iYXJzX05BICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF8xX1dSX2JhcnNfTkEgPC0gc2V0XzFfV1JfYmFyc19OQSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpCgpzZXRfMV9XUl9iYXJzX05BCmBgYAoKIyMjIyMgUmVtb3ZlZCBOQXMKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwpzdGF0X3MxX1dSX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzFfV1JbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfMV9XUiksXQoKIyMgcmVtb3ZlIGNvbnRyb2wtV08Kc3RhdF9zMV9XUl9jb21wbGV0ZSA8LSBmaWx0ZXIoc3RhdF9zMV9XUl9jb21wbGV0ZSwgaXNvbGF0ZSAhPSAiY29udHJvbC1XTyIpCgojIyBzZXQgdGhlIGNvbnRyb2wgdmFsdWUgZm9yIFdldCBSb290IG1nCnNldF8xX1dSX2NvbnRyb2xfaW50IDwtIGFzLm51bWVyaWMoc3RhdF9zMV9XUl9jb21wbGV0ZVszOSw1XSkKCiMjIGNhbGN1bGF0ZSAlIGNvbnRyb2wgZm9yIGVhY2ggdHJlYXRtZW50CnN0YXRfczFfV1JfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczFfV1JfY29tcGxldGVbMzksNV0pCgpzdGF0X3MxX1dSX2NvbXBsZXRlIDwtIG11dGF0ZShzdGF0X3MxX1dSX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCiMjIFBsb3QKCnNldF8xX1dSX2JhcnMgPC0gZ2dwbG90KHN0YXRfczFfV1JfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfMV9XUl9iYXJzIDwtIHNldF8xX1dSX2JhcnMgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgc2l6ZT0uNSwgZmlsbD0idGFuIikKc2V0XzFfV1JfYmFycyA8LSBzZXRfMV9XUl9iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfMV9XUl9jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfMV9XUl9iYXJzIDwtIHNldF8xX1dSX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlJvb3QgLSBGcmVzaCBXZWlnaHQgKG1nKSIpCnNldF8xX1dSX2JhcnMgPC0gc2V0XzFfV1JfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF8xX1dSX2JhcnMgPC0gc2V0XzFfV1JfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF8xX1dSX2JhcnMgPC0gc2V0XzFfV1JfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMV9XUl9iYXJzIDwtIHNldF8xX1dSX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsMjIwKSkKc2V0XzFfV1JfYmFycyA8LSBzZXRfMV9XUl9iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PWlzb2xhdGVbNl0sIHk9MjEwLCBsYWJlbD0iMjU4JSIpLCBoanVzdD0wLjM4KQpzZXRfMV9XUl9iYXJzIDwtIHNldF8xX1dSX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVs1XSwgeT0xNjUsIGxhYmVsPSIyNTMlIiksIGhqdXN0PTAuNDQpCnNldF8xX1dSX2JhcnMgPC0gc2V0XzFfV1JfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzJdLCB5PTE1MCwgbGFiZWw9IjIyMCUiKSwgaGp1c3Q9MC4zOCkKCnNldF8xX1dSX2JhcnMKYGBgCgojIyMjIyBDb3dwbG90IC0gU2V0IDEgLSBOQSdzIFJlbW92ZWQKYGBge3IsIGZpZy53aWR0aD0xMH0KCnNldF8xX3dldF9ncmlkIDwtIHBsb3RfZ3JpZChzZXRfMV9XU19iYXJzICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfMV9XUl9iYXJzICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwgIkIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX3NpemUgPSAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICd2aCcpCnNldF8xX3dldF9ncmlkCgpnZ3NhdmUoIi4vUGxvdHMvc2V0XzFfd2V0X2dyaWQucGRmIiwgc2V0XzFfd2V0X2dyaWQsIHdpZHRoID0gMTYsIGhlaWdodCA9IDE2KQpgYGAKCiMjIyMjIENvd3Bsb3QgLSBTZXQgMSAtIFdpdGggTkEncwpgYGB7ciwgZmlnLndpZHRoPTEwfQpzZXRfMV93ZXRfZ3JpZF9OQXMgPC0gcGxvdF9ncmlkKHNldF8xX1dTX2JhcnNfTkEgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF8xX1dSX2JhcnNfTkEgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCAiQiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfc2l6ZSA9IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2anVzdCA9IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICd2aCcpCnNldF8xX3dldF9ncmlkX05BcwoKZ2dzYXZlKCIuL1Bsb3RzL3NldF8xX3dldF9ncmlkX05Bcy5wZGYiLCBzZXRfMV93ZXRfZ3JpZF9OQXMsIHdpZHRoID0gMTYsIGhlaWdodCA9IDE2KQpgYGAKCiMjIyBTZXQgMi4xCgojIyMjIFdldCBTaG9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwpzdGF0X3MyLjFfV1NfY29tcGxldGUgPC0gc3RhdF9zZXRfMi4xX1dTW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzIuMV9XUyksXQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBXZXQgU2hvb3QgbWcKCnNldF8yLjFfV1NfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MyLjFfV1NfY29tcGxldGVbMzEsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MyLjFfV1NfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczIuMV9XU19jb21wbGV0ZVszMSw1XSkKCnN0YXRfczIuMV9XU19jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMi4xX1dTX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF8yLjFfV1NfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMi4xX1dTX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzIuMV9XU19iYXJzIDwtIHNldF8yLjFfV1NfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJsaWdodGdyZWVuIikKc2V0XzIuMV9XU19iYXJzIDwtIHNldF8yLjFfV1NfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzIuMV9XU19jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfMi4xX1dTX2JhcnMgPC0gc2V0XzIuMV9XU19iYXJzICsgbGFicyh4PSIiLCB5PSJTaG9vdCAtIEZyZXNoIFdlaWdodCAobWcpIikKc2V0XzIuMV9XU19iYXJzIDwtIHNldF8yLjFfV1NfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF8yLjFfV1NfYmFycyA8LSBzZXRfMi4xX1dTX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfMi4xX1dTX2JhcnMgPC0gc2V0XzIuMV9XU19iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF8yLjFfV1NfYmFycyA8LSBzZXRfMi4xX1dTX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNzAwKSkKc2V0XzIuMV9XU19iYXJzIDwtIHNldF8yLjFfV1NfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzEyXSwgeT01OTAsIGxhYmVsPSIzMDElIiksIGhqdXN0PTAuMzgpCnNldF8yLjFfV1NfYmFycwpgYGAKCiMjIyMgV2V0IFJvb3QKCmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKc3RhdF9zMi4xX1dSX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzIuMV9XUltjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF8yLjFfV1IpLF0KCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgV2V0IFJvb3QgbWcKc2V0XzIuMV9XUl9jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfczIuMV9XUl9jb21wbGV0ZVszMSw1XSkKCiMjIGNhbGN1bGF0ZSAlIGNvbnRyb2wgZm9yIGVhY2ggdHJlYXRtZW50CnN0YXRfczIuMV9XUl9jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zMi4xX1dSX2NvbXBsZXRlWzMxLDVdKQoKc3RhdF9zMi4xX1dSX2NvbXBsZXRlIDwtIG11dGF0ZShzdGF0X3MyLjFfV1JfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKc2V0XzIuMV9XUl9iYXJzIDwtIGdncGxvdChzdGF0X3MyLjFfV1JfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfMi4xX1dSX2JhcnMgPC0gc2V0XzIuMV9XUl9iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9InRhbiIpCnNldF8yLjFfV1JfYmFycyA8LSBzZXRfMi4xX1dSX2JhcnMgKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PXNldF8yLjFfV1JfY29udHJvbF9pbnQpLCBjb2xvdXI9IiM5OTAwMDAiLCBsaW5ldHlwZT0iZGFzaGVkIikKc2V0XzIuMV9XUl9iYXJzIDwtIHNldF8yLjFfV1JfYmFycyArIGxhYnMoeD0iIiwgeT0iUm9vdCAtIEZyZXNoIFdlaWdodCAobWcpIikKc2V0XzIuMV9XUl9iYXJzIDwtIHNldF8yLjFfV1JfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF8yLjFfV1JfYmFycyA8LSBzZXRfMi4xX1dSX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfMi4xX1dSX2JhcnMgPC0gc2V0XzIuMV9XUl9iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF8yLjFfV1JfYmFycyA8LSBzZXRfMi4xX1dSX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsMTgwKSkKc2V0XzIuMV9XUl9iYXJzIDwtIHNldF8yLjFfV1JfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzI0XSwgeT0xMzgsIGxhYmVsPSIyODglIiksIGhqdXN0PTAuMzgpCnNldF8yLjFfV1JfYmFycyA8LSBzZXRfMi4xX1dSX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVsyMV0sIHk9MTM2LCBsYWJlbD0iMjc0JSIpLCBoanVzdD0wLjQ0KQpzZXRfMi4xX1dSX2JhcnMgPC0gc2V0XzIuMV9XUl9iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PWlzb2xhdGVbMThdLCB5PTEyNSwgbGFiZWw9IjI2NSUiKSwgaGp1c3Q9MC4zOCkKc2V0XzIuMV9XUl9iYXJzIDwtIHNldF8yLjFfV1JfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzEyXSwgeT0xMzkuNSwgbGFiZWw9IjI2MiUiKSwgaGp1c3Q9MC4zOCkKCnNldF8yLjFfV1JfYmFycwpgYGAKCiMjIyMgQ293cGxvdCAtIFNldCAyLjEKYGBge3IsIGZpZy53aWR0aD0xMH0Kc2V0XzIuMV93ZXRfZ3JpZCA8LSBwbG90X2dyaWQoc2V0XzIuMV9XU19iYXJzICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfMi4xX1dSX2JhcnMgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCAiQiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfc2l6ZSA9IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gJ3ZoJykKc2V0XzIuMV93ZXRfZ3JpZAoKZ2dzYXZlKCIuL1Bsb3RzL3NldF8yLjFfd2V0X2dyaWQucGRmIiwgc2V0XzIuMV93ZXRfZ3JpZCwgd2lkdGggPSAxNiwgaGVpZ2h0ID0gMTYpCgpgYGAKCiMjIyBTZXQgMi4yCgojIyMjIFdldCBTaG9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwoKc3RhdF9zMi4yX1dTX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzIuMl9XU1tjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF8yLjJfV1MpLF0KCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgV2V0IFNob290IG1nCgpzZXRfMi4yX1dTX2NvbnRyb2xfaW50IDwtIGFzLm51bWVyaWMoc3RhdF9zMi4yX1dTX2NvbXBsZXRlWzMyLDVdKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zMi4yX1dTX2NvbXBsZXRlJGNvbnRyb2wgPC0gYXMubnVtZXJpYyhzdGF0X3MyLjJfV1NfY29tcGxldGVbMzIsNV0pCgpzdGF0X3MyLjJfV1NfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczIuMl9XU19jb21wbGV0ZSwgcF9jdHJsID0gKDEwMCogKEF2ZXJhZ2UgLyBjb250cm9sKSkpCgpzZXRfMi4yX1dTX2JhcnMgPC0gZ2dwbG90KHN0YXRfczIuMl9XU19jb21wbGV0ZSwgYWVzKHggPSBpc29sYXRlLCB5ID0gQXZlcmFnZSkpCnNldF8yLjJfV1NfYmFycyA8LSBzZXRfMi4yX1dTX2JhcnMgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgc2l6ZT0uNSwgZmlsbD0ibGlnaHRncmVlbiIpCnNldF8yLjJfV1NfYmFycyA8LSBzZXRfMi4yX1dTX2JhcnMgKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PXNldF8yLjJfV1NfY29udHJvbF9pbnQpLCBjb2xvdXI9IiM5OTAwMDAiLCBsaW5ldHlwZT0iZGFzaGVkIikKc2V0XzIuMl9XU19iYXJzIDwtIHNldF8yLjJfV1NfYmFycyArIGxhYnMoeD0iIiwgeT0iU2hvb3QgLSBGcmVzaCBXZWlnaHQgKG1nKSIpCnNldF8yLjJfV1NfYmFycyA8LSBzZXRfMi4yX1dTX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQpzZXRfMi4yX1dTX2JhcnMgPC0gc2V0XzIuMl9XU19iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzIuMl9XU19iYXJzIDwtIHNldF8yLjJfV1NfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMi4yX1dTX2JhcnMgPC0gc2V0XzIuMl9XU19iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDk5MCkpCnNldF8yLjJfV1NfYmFycyA8LSBzZXRfMi4yX1dTX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVsyNl0sIHk9OTQ1LCBsYWJlbD0iMjg1JSIpLCBoanVzdD0wLjM4KQpzZXRfMi4yX1dTX2JhcnMKYGBgCgojIyMjIFdldCBSb290CgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCnN0YXRfczIuMl9XUl9jb21wbGV0ZSA8LSBzdGF0X3NldF8yLjJfV1JbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfMi4yX1dSKSxdCgojIyBzZXQgdGhlIGNvbnRyb2wgdmFsdWUgZm9yIFdldCBSb290IG1nCnNldF8yLjJfV1JfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MyLjJfV1JfY29tcGxldGVbMzIsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MyLjJfV1JfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczIuMl9XUl9jb21wbGV0ZVszMiw1XSkKCnN0YXRfczIuMl9XUl9jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMi4yX1dSX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF8yLjJfV1JfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMi4yX1dSX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzIuMl9XUl9iYXJzIDwtIHNldF8yLjJfV1JfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJ0YW4iKQpzZXRfMi4yX1dSX2JhcnMgPC0gc2V0XzIuMl9XUl9iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfMi4yX1dSX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8yLjJfV1JfYmFycyA8LSBzZXRfMi4yX1dSX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlJvb3QgLSBGcmVzaCBXZWlnaHQgKG1nKSIpCnNldF8yLjJfV1JfYmFycyA8LSBzZXRfMi4yX1dSX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQpzZXRfMi4yX1dSX2JhcnMgPC0gc2V0XzIuMl9XUl9iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzIuMl9XUl9iYXJzIDwtIHNldF8yLjJfV1JfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMi4yX1dSX2JhcnMgPC0gc2V0XzIuMl9XUl9iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDE4MCkpCnNldF8yLjJfV1JfYmFycyA8LSBzZXRfMi4yX1dSX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVsyNl0sIHk9MTcwLCBsYWJlbD0iMjI2JSIpLCBoanVzdD0wLjM4KQpzZXRfMi4yX1dSX2JhcnMKYGBgCgojIyMjIENvd3Bsb3QgLSBTZXQgMi4yCmBgYHtyLCBmaWcud2lkdGg9MTB9CnNldF8yLjJfd2V0X2dyaWQgPC0gcGxvdF9ncmlkKHNldF8yLjJfV1NfYmFycyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzIuMl9XUl9iYXJzICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwgIkIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX3NpemUgPSAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICd2aCcpCnNldF8yLjJfd2V0X2dyaWQKCmdnc2F2ZSgiLi9QbG90cy9zZXRfMi4yX3dldF9ncmlkLnBkZiIsIHNldF8yLjJfd2V0X2dyaWQsIHdpZHRoID0gMTYsIGhlaWdodCA9IDE2KQpgYGAKCiMjIyBTZXQgMi4zCgojIyMjIFdldCBTaG9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwoKc3RhdF9zMi4zX1dTX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzIuM19XU1tjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF8yLjNfV1MpLF0KCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgV2V0IFNob290IG1nCnNldF8yLjNfV1NfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MyLjNfV1NfY29tcGxldGVbMjUsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MyLjNfV1NfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczIuM19XU19jb21wbGV0ZVsyNSw1XSkKCnN0YXRfczIuM19XU19jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMi4zX1dTX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF8yLjNfV1NfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMi4zX1dTX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzIuM19XU19iYXJzIDwtIHNldF8yLjNfV1NfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJsaWdodGdyZWVuIikKc2V0XzIuM19XU19iYXJzIDwtIHNldF8yLjNfV1NfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzIuM19XU19jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfMi4zX1dTX2JhcnMgPC0gc2V0XzIuM19XU19iYXJzICsgbGFicyh4PSIiLCB5PSJTaG9vdCAtIEZyZXNoIFdlaWdodCAobWcpIikKc2V0XzIuM19XU19iYXJzIDwtIHNldF8yLjNfV1NfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF8yLjNfV1NfYmFycyA8LSBzZXRfMi4zX1dTX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfMi4zX1dTX2JhcnMgPC0gc2V0XzIuM19XU19iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF8yLjNfV1NfYmFycyA8LSBzZXRfMi4zX1dTX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKQpzZXRfMi4zX1dTX2JhcnMgPC0gc2V0XzIuM19XU19iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PTEsIHk9NjUwLCBsYWJlbD0iU3RyZXRjaCBpdCIpLCB2anVzdD0tMSkKc2V0XzIuM19XU19iYXJzCmBgYAoKIyMjIyBXZXQgUm9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwpzdGF0X3MyLjNfV1JfY29tcGxldGUgPC0gc3RhdF9zZXRfMi4zX1dSW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzIuM19XUiksXQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBXZXQgUm9vdCBtZwpzZXRfMi4zX1dSX2NvbnRyb2xfaW50IDwtIGFzLm51bWVyaWMoc3RhdF9zMi4zX1dSX2NvbXBsZXRlWzI1LDVdKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zMi4zX1dSX2NvbXBsZXRlJGNvbnRyb2wgPC0gYXMubnVtZXJpYyhzdGF0X3MyLjNfV1JfY29tcGxldGVbMjUsNV0pCgpzdGF0X3MyLjNfV1JfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczIuM19XUl9jb21wbGV0ZSwgcF9jdHJsID0gKDEwMCogKEF2ZXJhZ2UgLyBjb250cm9sKSkpCgpzZXRfMi4zX1dSX2JhcnMgPC0gZ2dwbG90KHN0YXRfczIuM19XUl9jb21wbGV0ZSwgYWVzKHggPSBpc29sYXRlLCB5ID0gQXZlcmFnZSkpCnNldF8yLjNfV1JfYmFycyA8LSBzZXRfMi4zX1dSX2JhcnMgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgc2l6ZT0uNSwgZmlsbD0idGFuIikKc2V0XzIuM19XUl9iYXJzIDwtIHNldF8yLjNfV1JfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzIuM19XUl9jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfMi4zX1dSX2JhcnMgPC0gc2V0XzIuM19XUl9iYXJzICsgbGFicyh4PSIiLCB5PSJSb290IC0gRnJlc2ggV2VpZ2h0IChtZykiKQpzZXRfMi4zX1dSX2JhcnMgPC0gc2V0XzIuM19XUl9iYXJzICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BdmVyYWdlLVNFLCB5bWF4PUF2ZXJhZ2UrU0UpLCBzaXplPS41LCB3aWR0aD0uMikKc2V0XzIuM19XUl9iYXJzIDwtIHNldF8yLjNfV1JfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF8yLjNfV1JfYmFycyA8LSBzZXRfMi4zX1dSX2JhcnMgKyBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gImJvdHRvbSIsIGV4cGFuZCA9IGMoMCwwKSkKc2V0XzIuM19XUl9iYXJzIDwtIHNldF8yLjNfV1JfYmFycyArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpCnNldF8yLjNfV1JfYmFycyA8LSBzZXRfMi4zX1dSX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9MSwgeT0xOTUsIGxhYmVsPSIiKSwgdmp1c3Q9LTEpCnNldF8yLjNfV1JfYmFycwpgYGAKCiMjIyMgQ293cGxvdCAtIFNldCAyLjMKYGBge3IsIGZpZy53aWR0aD0xMH0Kc2V0XzIuM193ZXRfZ3JpZCA8LSBwbG90X2dyaWQoc2V0XzIuM19XU19iYXJzICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfMi4zX1dSX2JhcnMgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCAiQiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfc2l6ZSA9IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gJ3ZoJykKc2V0XzIuM193ZXRfZ3JpZAoKZ2dzYXZlKCIuL1Bsb3RzL3NldF8yLjNfd2V0X2dyaWQucGRmIiwgc2V0XzIuM193ZXRfZ3JpZCwgd2lkdGggPSAxNiwgaGVpZ2h0ID0gMTYpCgpgYGAKCiMjIyBTZXQgMi40CgojIyMjIFdldCBTaG9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwpzdGF0X3MyLjRfV1NfY29tcGxldGUgPC0gc3RhdF9zZXRfMi40X1dTW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzIuNF9XUyksXQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBXZXQgU2hvb3QgbWcKc2V0XzIuNF9XU19jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfczIuNF9XU19jb21wbGV0ZVszNiw1XSkKCiMjIGNhbGN1bGF0ZSAlIGNvbnRyb2wgZm9yIGVhY2ggdHJlYXRtZW50CnN0YXRfczIuNF9XU19jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zMi40X1dTX2NvbXBsZXRlWzM2LDVdKQoKc3RhdF9zMi40X1dTX2NvbXBsZXRlIDwtIG11dGF0ZShzdGF0X3MyLjRfV1NfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKc2V0XzIuNF9XU19iYXJzIDwtIGdncGxvdChzdGF0X3MyLjRfV1NfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfMi40X1dTX2JhcnMgPC0gc2V0XzIuNF9XU19iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9ImxpZ2h0Z3JlZW4iKQpzZXRfMi40X1dTX2JhcnMgPC0gc2V0XzIuNF9XU19iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfMi40X1dTX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8yLjRfV1NfYmFycyA8LSBzZXRfMi40X1dTX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlNob290IC0gRnJlc2ggV2VpZ2h0IChtZykiKQpzZXRfMi40X1dTX2JhcnMgPC0gc2V0XzIuNF9XU19iYXJzICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BdmVyYWdlLVNFLCB5bWF4PUF2ZXJhZ2UrU0UpLCBzaXplPS41LCB3aWR0aD0uMikKc2V0XzIuNF9XU19iYXJzIDwtIHNldF8yLjRfV1NfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF8yLjRfV1NfYmFycyA8LSBzZXRfMi40X1dTX2JhcnMgKyBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gImJvdHRvbSIsIGV4cGFuZCA9IGMoMCwwKSkKc2V0XzIuNF9XU19iYXJzIDwtIHNldF8yLjRfV1NfYmFycyArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCw3NzUpKQpzZXRfMi40X1dTX2JhcnMgPC0gc2V0XzIuNF9XU19iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PWlzb2xhdGVbMzRdLCB5PTczNSwgbGFiZWw9IjI1NiUiKSwgaGp1c3Q9MC4zOCkKc2V0XzIuNF9XU19iYXJzIDwtIHNldF8yLjRfV1NfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzI1XSwgeT02MzYsIGxhYmVsPSIxOTclIiksIGhqdXN0PTAuMzgpCgpzZXRfMi40X1dTX2JhcnMKYGBgCgojIyMjIFdldCBSb290CgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCnN0YXRfczIuNF9XUl9jb21wbGV0ZSA8LSBzdGF0X3NldF8yLjRfV1JbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfMi40X1dSKSxdCgojIyBzZXQgdGhlIGNvbnRyb2wgdmFsdWUgZm9yIFdldCBSb290IG1nCnNldF8yLjRfV1JfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MyLjRfV1JfY29tcGxldGVbMzYsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MyLjRfV1JfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczIuNF9XUl9jb21wbGV0ZVszNiw1XSkKCnN0YXRfczIuNF9XUl9jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMi40X1dSX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF8yLjRfV1JfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMi40X1dSX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzIuNF9XUl9iYXJzIDwtIHNldF8yLjRfV1JfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJ0YW4iKQpzZXRfMi40X1dSX2JhcnMgPC0gc2V0XzIuNF9XUl9iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfMi40X1dSX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8yLjRfV1JfYmFycyA8LSBzZXRfMi40X1dSX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlJvb3QgLSBGcmVzaCBXZWlnaHQgKG1nKSIpCnNldF8yLjRfV1JfYmFycyA8LSBzZXRfMi40X1dSX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQpzZXRfMi40X1dSX2JhcnMgPC0gc2V0XzIuNF9XUl9iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzIuNF9XUl9iYXJzIDwtIHNldF8yLjRfV1JfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMi40X1dSX2JhcnMgPC0gc2V0XzIuNF9XUl9iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDE3NSkpCnNldF8yLjRfV1JfYmFycyA8LSBzZXRfMi40X1dSX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVszNF0sIHk9MTY1LCBsYWJlbD0iMjkzJSIpLCBoanVzdD0wLjM4KQpzZXRfMi40X1dSX2JhcnMKYGBgCgojIyMjIENvd3Bsb3QgLSBTZXQgMi40CmBgYHtyLCBmaWcud2lkdGg9MTB9CnNldF8yLjRfd2V0X2dyaWQgPC0gcGxvdF9ncmlkKHNldF8yLjRfV1NfYmFycyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzIuNF9XUl9iYXJzICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwgIkIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX3NpemUgPSAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICd2aCcpCnNldF8yLjRfd2V0X2dyaWQKCmdnc2F2ZSgiLi9QbG90cy9zZXRfMi40X3dldF9ncmlkLnBkZiIsIHNldF8yLjRfd2V0X2dyaWQsIHdpZHRoID0gMTYsIGhlaWdodCA9IDE2KQoKYGBgCgojIyMgU2V0IDMuMQoKIyMjIyBXZXQgU2hvb3QKCmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKc3RhdF9zMy4xX1dTX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzMuMV9XU1tjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF8zLjFfV1MpLF0KCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgV2V0IFNob290IG1nCnNldF8zLjFfV1NfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MzLjFfV1NfY29tcGxldGVbMzYsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MzLjFfV1NfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczMuMV9XU19jb21wbGV0ZVszNiw1XSkKCnN0YXRfczMuMV9XU19jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMy4xX1dTX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF8zLjFfV1NfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMy4xX1dTX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzMuMV9XU19iYXJzIDwtIHNldF8zLjFfV1NfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJsaWdodGdyZWVuIikKc2V0XzMuMV9XU19iYXJzIDwtIHNldF8zLjFfV1NfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzMuMV9XU19jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfMy4xX1dTX2JhcnMgPC0gc2V0XzMuMV9XU19iYXJzICsgbGFicyh4PSIiLCB5PSJTaG9vdCAtIEZyZXNoIFdlaWdodCAobWcpIikKc2V0XzMuMV9XU19iYXJzIDwtIHNldF8zLjFfV1NfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF8zLjFfV1NfYmFycyA8LSBzZXRfMy4xX1dTX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfMy4xX1dTX2JhcnMgPC0gc2V0XzMuMV9XU19iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF8zLjFfV1NfYmFycyA8LSBzZXRfMy4xX1dTX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsOTAwKSkKc2V0XzMuMV9XU19iYXJzIDwtIHNldF8zLjFfV1NfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzE4XSwgeT04MTQsIGxhYmVsPSIyMzMlIiksIGhqdXN0PTAuMzgpCnNldF8zLjFfV1NfYmFycyA8LSBzZXRfMy4xX1dTX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVszM10sIHk9NTY0LCBsYWJlbD0iMjIzJSIpLCBoanVzdD0wLjM4KQpzZXRfMy4xX1dTX2JhcnMKYGBgCgojIyMjIFdldCBSb290CgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCnN0YXRfczMuMV9XUl9jb21wbGV0ZSA8LSBzdGF0X3NldF8zLjFfV1JbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfMy4xX1dSKSxdCgojIyBzZXQgdGhlIGNvbnRyb2wgdmFsdWUgZm9yIFdldCBSb290IG1nCnNldF8zLjFfV1JfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MzLjFfV1JfY29tcGxldGVbMzYsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MzLjFfV1JfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczMuMV9XUl9jb21wbGV0ZVszNiw1XSkKCnN0YXRfczMuMV9XUl9jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMy4xX1dSX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF8zLjFfV1JfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMy4xX1dSX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzMuMV9XUl9iYXJzIDwtIHNldF8zLjFfV1JfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJ0YW4iKQpzZXRfMy4xX1dSX2JhcnMgPC0gc2V0XzMuMV9XUl9iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfMy4xX1dSX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8zLjFfV1JfYmFycyA8LSBzZXRfMy4xX1dSX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlJvb3QgLSBGcmVzaCBXZWlnaHQgKG1nKSIpCnNldF8zLjFfV1JfYmFycyA8LSBzZXRfMy4xX1dSX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQpzZXRfMy4xX1dSX2JhcnMgPC0gc2V0XzMuMV9XUl9iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzMuMV9XUl9iYXJzIDwtIHNldF8zLjFfV1JfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMy4xX1dSX2JhcnMgPC0gc2V0XzMuMV9XUl9iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDE0NSkpCnNldF8zLjFfV1JfYmFycyA8LSBzZXRfMy4xX1dSX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVsxOF0sIHk9MTMyLCBsYWJlbD0iMTk0JSIpLCBoanVzdD0wLjM4KQoKc2V0XzMuMV9XUl9iYXJzCmBgYAoKIyMjIyBDb3dwbG90IC0gU2V0IDMuMQpgYGB7ciwgZmlnLndpZHRoPTEwfQpzZXRfMy4xX3dldF9ncmlkIDwtIHBsb3RfZ3JpZChzZXRfMy4xX1dTX2JhcnMgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF8zLjFfV1JfYmFycyArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQSIsICJCIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9zaXplID0gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAndmgnKQpzZXRfMy4xX3dldF9ncmlkCgpnZ3NhdmUoIi4vUGxvdHMvc2V0XzMuMV93ZXRfZ3JpZC5wZGYiLCBzZXRfMy4xX3dldF9ncmlkLCB3aWR0aCA9IDE2LCBoZWlnaHQgPSAxNikKCmBgYAoKCiMjIyBTZXQgMy4yCgojIyMjIFdldCBTaG9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwpzdGF0X3MzLjJfV1NfY29tcGxldGUgPC0gc3RhdF9zZXRfMy4yX1dTW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzMuMl9XUyksXQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBXZXQgU2hvb3QgbWcKc2V0XzMuMl9XU19jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfczMuMl9XU19jb21wbGV0ZVsyNCw1XSkKCiMjIGNhbGN1bGF0ZSAlIGNvbnRyb2wgZm9yIGVhY2ggdHJlYXRtZW50CnN0YXRfczMuMl9XU19jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zMy4yX1dTX2NvbXBsZXRlWzI0LDVdKQoKc3RhdF9zMy4yX1dTX2NvbXBsZXRlIDwtIG11dGF0ZShzdGF0X3MzLjJfV1NfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKc2V0XzMuMl9XU19iYXJzIDwtIGdncGxvdChzdGF0X3MzLjJfV1NfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfMy4yX1dTX2JhcnMgPC0gc2V0XzMuMl9XU19iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9ImxpZ2h0Z3JlZW4iKQpzZXRfMy4yX1dTX2JhcnMgPC0gc2V0XzMuMl9XU19iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfMy4yX1dTX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8zLjJfV1NfYmFycyA8LSBzZXRfMy4yX1dTX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlNob290IC0gRnJlc2ggV2VpZ2h0IChtZykiKQpzZXRfMy4yX1dTX2JhcnMgPC0gc2V0XzMuMl9XU19iYXJzICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BdmVyYWdlLVNFLCB5bWF4PUF2ZXJhZ2UrU0UpLCBzaXplPS41LCB3aWR0aD0uMikKc2V0XzMuMl9XU19iYXJzIDwtIHNldF8zLjJfV1NfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF8zLjJfV1NfYmFycyA8LSBzZXRfMy4yX1dTX2JhcnMgKyBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gImJvdHRvbSIsIGV4cGFuZCA9IGMoMCwwKSkKc2V0XzMuMl9XU19iYXJzIDwtIHNldF8zLjJfV1NfYmFycyArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpCnNldF8zLjJfV1NfYmFycyA8LSBzZXRfMy4yX1dTX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9MSwgeT01NjAsIGxhYmVsPSJTdHJldGNoIGl0IiksIHZqdXN0PS0xKQpzZXRfMy4yX1dTX2JhcnMKYGBgCgojIyMjIFdldCBSb290CgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCnN0YXRfczMuMl9XUl9jb21wbGV0ZSA8LSBzdGF0X3NldF8zLjJfV1JbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfMy4yX1dSKSxdCgojIyBzZXQgdGhlIGNvbnRyb2wgdmFsdWUgZm9yIFdldCBSb290IG1nCnNldF8zLjJfV1JfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MzLjJfV1JfY29tcGxldGVbMjQsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MzLjJfV1JfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczMuMl9XUl9jb21wbGV0ZVsyNCw1XSkKCnN0YXRfczMuMl9XUl9jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMy4yX1dSX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF8zLjJfV1JfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMy4yX1dSX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzMuMl9XUl9iYXJzIDwtIHNldF8zLjJfV1JfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJ0YW4iKQpzZXRfMy4yX1dSX2JhcnMgPC0gc2V0XzMuMl9XUl9iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfMy4yX1dSX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8zLjJfV1JfYmFycyA8LSBzZXRfMy4yX1dSX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlJvb3QgLSBGcmVzaCBXZWlnaHQgKG1nKSIpCnNldF8zLjJfV1JfYmFycyA8LSBzZXRfMy4yX1dSX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQpzZXRfMy4yX1dSX2JhcnMgPC0gc2V0XzMuMl9XUl9iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzMuMl9XUl9iYXJzIDwtIHNldF8zLjJfV1JfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMy4yX1dSX2JhcnMgPC0gc2V0XzMuMl9XUl9iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkKc2V0XzMuMl9XUl9iYXJzIDwtIHNldF8zLjJfV1JfYmFycyArIGdlb21fdGV4dChhZXMoeD0xLCB5PTk1LCBsYWJlbD0iIiksIHZqdXN0PS0xKQpzZXRfMy4yX1dSX2JhcnMKYGBgCgojIyMjIENvd3Bsb3QgLSBTZXQgMy4yCmBgYHtyLCBmaWcud2lkdGg9MTB9CnNldF8zLjJfd2V0X2dyaWQgPC0gcGxvdF9ncmlkKHNldF8zLjJfV1NfYmFycyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzMuMl9XUl9iYXJzICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwgIkIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX3NpemUgPSAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICd2aCcpCnNldF8zLjJfd2V0X2dyaWQKCmdnc2F2ZSgiLi9QbG90cy9zZXRfMy4yX3dldF9ncmlkLnBkZiIsIHNldF8zLjJfd2V0X2dyaWQsIHdpZHRoID0gMTYsIGhlaWdodCA9IDE2KQoKYGBgCgoKCiMjIyBTZXQgMy4zCgojIyMjIFdldCBTaG9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwpzdGF0X3MzLjNfV1NfY29tcGxldGUgPC0gc3RhdF9zZXRfMy4zX1dTW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzMuM19XUyksXQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBXZXQgU2hvb3QgbWcKc2V0XzMuM19XU19jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfczMuM19XU19jb21wbGV0ZVszNyw1XSkKCiMjIGNhbGN1bGF0ZSAlIGNvbnRyb2wgZm9yIGVhY2ggdHJlYXRtZW50CnN0YXRfczMuM19XU19jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zMy4zX1dTX2NvbXBsZXRlWzM3LDVdKQoKc3RhdF9zMy4zX1dTX2NvbXBsZXRlIDwtIG11dGF0ZShzdGF0X3MzLjNfV1NfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKc2V0XzMuM19XU19iYXJzIDwtIGdncGxvdChzdGF0X3MzLjNfV1NfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfMy4zX1dTX2JhcnMgPC0gc2V0XzMuM19XU19iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9ImxpZ2h0Z3JlZW4iKQpzZXRfMy4zX1dTX2JhcnMgPC0gc2V0XzMuM19XU19iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfMy4zX1dTX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8zLjNfV1NfYmFycyA8LSBzZXRfMy4zX1dTX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlNob290IC0gRnJlc2ggV2VpZ2h0IChtZykiKQpzZXRfMy4zX1dTX2JhcnMgPC0gc2V0XzMuM19XU19iYXJzICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BdmVyYWdlLVNFLCB5bWF4PUF2ZXJhZ2UrU0UpLCBzaXplPS41LCB3aWR0aD0uMikKc2V0XzMuM19XU19iYXJzIDwtIHNldF8zLjNfV1NfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF8zLjNfV1NfYmFycyA8LSBzZXRfMy4zX1dTX2JhcnMgKyBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gImJvdHRvbSIsIGV4cGFuZCA9IGMoMCwwKSkKc2V0XzMuM19XU19iYXJzIDwtIHNldF8zLjNfV1NfYmFycyArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpCnNldF8zLjNfV1NfYmFycyA8LSBzZXRfMy4zX1dTX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9MSwgeT05OTAsIGxhYmVsPSIiKSwgdmp1c3Q9LTEpCnNldF8zLjNfV1NfYmFycwpgYGAKCiMjIyMgV2V0IFJvb3QKCmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKc3RhdF9zMy4zX1dSX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzMuM19XUltjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF8zLjNfV1IpLF0KCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgV2V0IFJvb3QgbWcKc2V0XzMuM19XUl9jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfczMuM19XUl9jb21wbGV0ZVszNyw1XSkKCiMjIGNhbGN1bGF0ZSAlIGNvbnRyb2wgZm9yIGVhY2ggdHJlYXRtZW50CnN0YXRfczMuM19XUl9jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zMy4zX1dSX2NvbXBsZXRlWzM3LDVdKQoKc3RhdF9zMy4zX1dSX2NvbXBsZXRlIDwtIG11dGF0ZShzdGF0X3MzLjNfV1JfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKc2V0XzMuM19XUl9iYXJzIDwtIGdncGxvdChzdGF0X3MzLjNfV1JfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfMy4zX1dSX2JhcnMgPC0gc2V0XzMuM19XUl9iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9InRhbiIpCnNldF8zLjNfV1JfYmFycyA8LSBzZXRfMy4zX1dSX2JhcnMgKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PXNldF8zLjNfV1JfY29udHJvbF9pbnQpLCBjb2xvdXI9IiM5OTAwMDAiLCBsaW5ldHlwZT0iZGFzaGVkIikKc2V0XzMuM19XUl9iYXJzIDwtIHNldF8zLjNfV1JfYmFycyArIGxhYnMoeD0iIiwgeT0iUm9vdCAtIEZyZXNoIFdlaWdodCAobWcpIikKc2V0XzMuM19XUl9iYXJzIDwtIHNldF8zLjNfV1JfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF8zLjNfV1JfYmFycyA8LSBzZXRfMy4zX1dSX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfMy4zX1dSX2JhcnMgPC0gc2V0XzMuM19XUl9iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF8zLjNfV1JfYmFycyA8LSBzZXRfMy4zX1dSX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKQpzZXRfMy4zX1dSX2JhcnMgPC0gc2V0XzMuM19XUl9iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PTEsIHk9MTc1LCBsYWJlbD0iIiksIHZqdXN0PS0xKQpzZXRfMy4zX1dSX2JhcnMKYGBgCgojIyMjIENvd3Bsb3QgLSBTZXQgMy4zCmBgYHtyLCBmaWcud2lkdGg9MTB9CnNldF8zLjNfd2V0X2dyaWQgPC0gcGxvdF9ncmlkKHNldF8zLjNfV1NfYmFycyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzMuM19XUl9iYXJzICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwgIkIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX3NpemUgPSAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICd2aCcpCnNldF8zLjNfd2V0X2dyaWQKCmdnc2F2ZSgiLi9QbG90cy9zZXRfMy4zX3dldF9ncmlkLnBkZiIsIHNldF8zLjNfd2V0X2dyaWQsIHdpZHRoID0gMTYsIGhlaWdodCA9IDE2KQoKYGBgCgoKIyMjIFNldCAzLjQKCiMjIyMgV2V0IFNob290CgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCnN0YXRfczMuNF9XU19jb21wbGV0ZSA8LSBzdGF0X3NldF8zLjRfV1NbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfMy40X1dTKSxdCgojIyBzZXQgdGhlIGNvbnRyb2wgdmFsdWUgZm9yIFdldCBTaG9vdCBtZwpzZXRfMy40X1dTX2NvbnRyb2xfaW50IDwtIGFzLm51bWVyaWMoc3RhdF9zMy40X1dTX2NvbXBsZXRlWzM2LDVdKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zMy40X1dTX2NvbXBsZXRlJGNvbnRyb2wgPC0gYXMubnVtZXJpYyhzdGF0X3MzLjRfV1NfY29tcGxldGVbMzYsNV0pCgpzdGF0X3MzLjRfV1NfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczMuNF9XU19jb21wbGV0ZSwgcF9jdHJsID0gKDEwMCogKEF2ZXJhZ2UgLyBjb250cm9sKSkpCgpzZXRfMy40X1dTX2JhcnMgPC0gZ2dwbG90KHN0YXRfczMuNF9XU19jb21wbGV0ZSwgYWVzKHggPSBpc29sYXRlLCB5ID0gQXZlcmFnZSkpCnNldF8zLjRfV1NfYmFycyA8LSBzZXRfMy40X1dTX2JhcnMgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgc2l6ZT0uNSwgZmlsbD0ibGlnaHRncmVlbiIpCnNldF8zLjRfV1NfYmFycyA8LSBzZXRfMy40X1dTX2JhcnMgKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PXNldF8zLjRfV1NfY29udHJvbF9pbnQpLCBjb2xvdXI9IiM5OTAwMDAiLCBsaW5ldHlwZT0iZGFzaGVkIikKc2V0XzMuNF9XU19iYXJzIDwtIHNldF8zLjRfV1NfYmFycyArIGxhYnMoeD0iIiwgeT0iU2hvb3QgLSBGcmVzaCBXZWlnaHQgKG1nKSIpCnNldF8zLjRfV1NfYmFycyA8LSBzZXRfMy40X1dTX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQpzZXRfMy40X1dTX2JhcnMgPC0gc2V0XzMuNF9XU19iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzMuNF9XU19iYXJzIDwtIHNldF8zLjRfV1NfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMy40X1dTX2JhcnMgPC0gc2V0XzMuNF9XU19iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkKc2V0XzMuNF9XU19iYXJzIDwtIHNldF8zLjRfV1NfYmFycyArIGdlb21fdGV4dChhZXMoeD0xLCB5PTU4MCwgbGFiZWw9IlN0cmV0Y2ggaXQiKSwgdmp1c3Q9LTEpCnNldF8zLjRfV1NfYmFycwpgYGAKCiMjIyMgV2V0IFJvb3QKCmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKc3RhdF9zMy40X1dSX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzMuNF9XUltjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF8zLjRfV1IpLF0KCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgV2V0IFJvb3QgbWcKc2V0XzMuNF9XUl9jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfczMuNF9XUl9jb21wbGV0ZVszNiw1XSkKCiMjIGNhbGN1bGF0ZSAlIGNvbnRyb2wgZm9yIGVhY2ggdHJlYXRtZW50CnN0YXRfczMuNF9XUl9jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zMy40X1dSX2NvbXBsZXRlWzM2LDVdKQoKc3RhdF9zMy40X1dSX2NvbXBsZXRlIDwtIG11dGF0ZShzdGF0X3MzLjRfV1JfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKc2V0XzMuNF9XUl9iYXJzIDwtIGdncGxvdChzdGF0X3MzLjRfV1JfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfMy40X1dSX2JhcnMgPC0gc2V0XzMuNF9XUl9iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9InRhbiIpCnNldF8zLjRfV1JfYmFycyA8LSBzZXRfMy40X1dSX2JhcnMgKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PXNldF8zLjRfV1JfY29udHJvbF9pbnQpLCBjb2xvdXI9IiM5OTAwMDAiLCBsaW5ldHlwZT0iZGFzaGVkIikKc2V0XzMuNF9XUl9iYXJzIDwtIHNldF8zLjRfV1JfYmFycyArIGxhYnMoeD0iIiwgeT0iUm9vdCAtIEZyZXNoIFdlaWdodCAobWcpIikKc2V0XzMuNF9XUl9iYXJzIDwtIHNldF8zLjRfV1JfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF8zLjRfV1JfYmFycyA8LSBzZXRfMy40X1dSX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfMy40X1dSX2JhcnMgPC0gc2V0XzMuNF9XUl9iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF8zLjRfV1JfYmFycyA8LSBzZXRfMy40X1dSX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKQpzZXRfMy40X1dSX2JhcnMgPC0gc2V0XzMuNF9XUl9iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PTEsIHk9OTAsIGxhYmVsPSIiKSwgdmp1c3Q9LTEpCnNldF8zLjRfV1JfYmFycwpgYGAKCiMjIyMgQ293cGxvdCAtIFNldCAzLjQKYGBge3IsIGZpZy53aWR0aD0xMH0Kc2V0XzMuNF93ZXRfZ3JpZCA8LSBwbG90X2dyaWQoc2V0XzMuNF9XU19iYXJzICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfMy40X1dSX2JhcnMgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCAiQiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfc2l6ZSA9IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gJ3ZoJykKc2V0XzMuNF93ZXRfZ3JpZAoKZ2dzYXZlKCIuL1Bsb3RzL3NldF8zLjRfd2V0X2dyaWQucGRmIiwgc2V0XzMuNF93ZXRfZ3JpZCwgd2lkdGggPSAxNiwgaGVpZ2h0ID0gMTYpCgpgYGAKCiMjIyBTZXQgMy41CgojIyMjIFdldCBTaG9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwpzdGF0X3MzLjVfV1NfY29tcGxldGUgPC0gc3RhdF9zZXRfMy41X1dTW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzMuNV9XUyksXQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBXZXQgU2hvb3QgbWcKc2V0XzMuNV9XU19jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfczMuNV9XU19jb21wbGV0ZVsyMCw1XSkKCiMjIGNhbGN1bGF0ZSAlIGNvbnRyb2wgZm9yIGVhY2ggdHJlYXRtZW50CnN0YXRfczMuNV9XU19jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zMy41X1dTX2NvbXBsZXRlWzIwLDVdKQoKc3RhdF9zMy41X1dTX2NvbXBsZXRlIDwtIG11dGF0ZShzdGF0X3MzLjVfV1NfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKc2V0XzMuNV9XU19iYXJzIDwtIGdncGxvdChzdGF0X3MzLjVfV1NfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfMy41X1dTX2JhcnMgPC0gc2V0XzMuNV9XU19iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9ImxpZ2h0Z3JlZW4iKQpzZXRfMy41X1dTX2JhcnMgPC0gc2V0XzMuNV9XU19iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfMy41X1dTX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8zLjVfV1NfYmFycyA8LSBzZXRfMy41X1dTX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlNob290IC0gRnJlc2ggV2VpZ2h0IChtZykiKQpzZXRfMy41X1dTX2JhcnMgPC0gc2V0XzMuNV9XU19iYXJzICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BdmVyYWdlLVNFLCB5bWF4PUF2ZXJhZ2UrU0UpLCBzaXplPS41LCB3aWR0aD0uMikKc2V0XzMuNV9XU19iYXJzIDwtIHNldF8zLjVfV1NfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF8zLjVfV1NfYmFycyA8LSBzZXRfMy41X1dTX2JhcnMgKyBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gImJvdHRvbSIsIGV4cGFuZCA9IGMoMCwwKSkKc2V0XzMuNV9XU19iYXJzIDwtIHNldF8zLjVfV1NfYmFycyArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpCnNldF8zLjVfV1NfYmFycyA8LSBzZXRfMy41X1dTX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9MSwgeT01ODAsIGxhYmVsPSJTdHJldGNoIGl0IiksIHZqdXN0PS0xKQpzZXRfMy41X1dTX2JhcnMKYGBgCgojIyMjIFdldCBSb290CgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCnN0YXRfczMuNV9XUl9jb21wbGV0ZSA8LSBzdGF0X3NldF8zLjVfV1JbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfMy41X1dSKSxdCgojIyBzZXQgdGhlIGNvbnRyb2wgdmFsdWUgZm9yIFdldCBSb290IG1nCnNldF8zLjVfV1JfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MzLjVfV1JfY29tcGxldGVbMjAsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MzLjVfV1JfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczMuNV9XUl9jb21wbGV0ZVsyMCw1XSkKCnN0YXRfczMuNV9XUl9jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMy41X1dSX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF8zLjVfV1JfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMy41X1dSX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzMuNV9XUl9iYXJzIDwtIHNldF8zLjVfV1JfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJ0YW4iKQpzZXRfMy41X1dSX2JhcnMgPC0gc2V0XzMuNV9XUl9iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfMy41X1dSX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8zLjVfV1JfYmFycyA8LSBzZXRfMy41X1dSX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlJvb3QgLSBGcmVzaCBXZWlnaHQgKG1nKSIpCnNldF8zLjVfV1JfYmFycyA8LSBzZXRfMy41X1dSX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQpzZXRfMy41X1dSX2JhcnMgPC0gc2V0XzMuNV9XUl9iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzMuNV9XUl9iYXJzIDwtIHNldF8zLjVfV1JfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMy41X1dSX2JhcnMgPC0gc2V0XzMuNV9XUl9iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkKc2V0XzMuNV9XUl9iYXJzIDwtIHNldF8zLjVfV1JfYmFycyArIGdlb21fdGV4dChhZXMoeD0xLCB5PTk5LCBsYWJlbD0iIiksIHZqdXN0PS0xKQpzZXRfMy41X1dSX2JhcnMKYGBgCgojIyMjIENvd3Bsb3QgLSBTZXQgMy41CmBgYHtyLCBmaWcud2lkdGg9MTB9CnNldF8zLjVfd2V0X2dyaWQgPC0gcGxvdF9ncmlkKHNldF8zLjVfV1NfYmFycyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzMuNV9XUl9iYXJzICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwgIkIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX3NpemUgPSAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICd2aCcpCnNldF8zLjVfd2V0X2dyaWQKCmdnc2F2ZSgiLi9QbG90cy9zZXRfMy41X3dldF9ncmlkLnBkZiIsIHNldF8zLjVfd2V0X2dyaWQsIHdpZHRoID0gMTYsIGhlaWdodCA9IDE2KQoKYGBgCgojIyMgU2V0IDQuMQoKIyMjIyBXZXQgU2hvb3QKCmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKc3RhdF9zNC4xX1dTX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzQuMV9XU1tjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF80LjFfV1MpLF0KCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgV2V0IFNob290IG1nCnNldF80LjFfV1NfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3M0LjFfV1NfY29tcGxldGVbMzcsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3M0LjFfV1NfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczQuMV9XU19jb21wbGV0ZVszNyw1XSkKCnN0YXRfczQuMV9XU19jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zNC4xX1dTX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF80LjFfV1NfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zNC4xX1dTX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzQuMV9XU19iYXJzIDwtIHNldF80LjFfV1NfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJsaWdodGdyZWVuIikKc2V0XzQuMV9XU19iYXJzIDwtIHNldF80LjFfV1NfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzQuMV9XU19jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfNC4xX1dTX2JhcnMgPC0gc2V0XzQuMV9XU19iYXJzICsgbGFicyh4PSIiLCB5PSJTaG9vdCAtIEZyZXNoIFdlaWdodCAobWcpIikKc2V0XzQuMV9XU19iYXJzIDwtIHNldF80LjFfV1NfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF80LjFfV1NfYmFycyA8LSBzZXRfNC4xX1dTX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfNC4xX1dTX2JhcnMgPC0gc2V0XzQuMV9XU19iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF80LjFfV1NfYmFycyA8LSBzZXRfNC4xX1dTX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNzUwKSkKc2V0XzQuMV9XU19iYXJzIDwtIHNldF80LjFfV1NfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzI1XSwgeT02ODAsIGxhYmVsPSIxODklIiksIGhqdXN0PTAuMzgpCnNldF80LjFfV1NfYmFycwpgYGAKCiMjIyMgV2V0IFJvb3QKCmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKc3RhdF9zNC4xX1dSX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzQuMV9XUltjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF80LjFfV1IpLF0KCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgV2V0IFJvb3QgbWcKc2V0XzQuMV9XUl9jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfczQuMV9XUl9jb21wbGV0ZVszNyw1XSkKCiMjIGNhbGN1bGF0ZSAlIGNvbnRyb2wgZm9yIGVhY2ggdHJlYXRtZW50CnN0YXRfczQuMV9XUl9jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zNC4xX1dSX2NvbXBsZXRlWzM3LDVdKQoKc3RhdF9zNC4xX1dSX2NvbXBsZXRlIDwtIG11dGF0ZShzdGF0X3M0LjFfV1JfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKc2V0XzQuMV9XUl9iYXJzIDwtIGdncGxvdChzdGF0X3M0LjFfV1JfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfNC4xX1dSX2JhcnMgPC0gc2V0XzQuMV9XUl9iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9InRhbiIpCnNldF80LjFfV1JfYmFycyA8LSBzZXRfNC4xX1dSX2JhcnMgKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PXNldF80LjFfV1JfY29udHJvbF9pbnQpLCBjb2xvdXI9IiM5OTAwMDAiLCBsaW5ldHlwZT0iZGFzaGVkIikKc2V0XzQuMV9XUl9iYXJzIDwtIHNldF80LjFfV1JfYmFycyArIGxhYnMoeD0iIiwgeT0iUm9vdCAtIEZyZXNoIFdlaWdodCAobWcpIikKc2V0XzQuMV9XUl9iYXJzIDwtIHNldF80LjFfV1JfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF80LjFfV1JfYmFycyA8LSBzZXRfNC4xX1dSX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfNC4xX1dSX2JhcnMgPC0gc2V0XzQuMV9XUl9iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF80LjFfV1JfYmFycyA8LSBzZXRfNC4xX1dSX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKQpzZXRfNC4xX1dSX2JhcnMgPC0gc2V0XzQuMV9XUl9iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PTEsIHk9NTksIGxhYmVsPSIiKSwgdmp1c3Q9LTEpCnNldF80LjFfV1JfYmFycwpgYGAKCiMjIyMgQ293cGxvdCAtIFNldCA0LjEKYGBge3IsIGZpZy53aWR0aD0xMH0Kc2V0XzQuMV93ZXRfZ3JpZCA8LSBwbG90X2dyaWQoc2V0XzQuMV9XU19iYXJzICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfNC4xX1dSX2JhcnMgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCAiQiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfc2l6ZSA9IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gJ3ZoJykKc2V0XzQuMV93ZXRfZ3JpZAoKZ2dzYXZlKCIuL1Bsb3RzL3NldF80LjFfd2V0X2dyaWQucGRmIiwgc2V0XzQuMV93ZXRfZ3JpZCwgd2lkdGggPSAxNiwgaGVpZ2h0ID0gMTYpCgpgYGAKCiMjIyBTZXQgNC4yCgojIyMjIFdldCBTaG9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwpzdGF0X3M0LjJfV1NfY29tcGxldGUgPC0gc3RhdF9zZXRfNC4yX1dTW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzQuMl9XUyksXQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBXZXQgU2hvb3QgbWcKc2V0XzQuMl9XU19jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfczQuMl9XU19jb21wbGV0ZVsyMyw1XSkKCiMjIGNhbGN1bGF0ZSAlIGNvbnRyb2wgZm9yIGVhY2ggdHJlYXRtZW50CnN0YXRfczQuMl9XU19jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zNC4yX1dTX2NvbXBsZXRlWzIzLDVdKQoKc3RhdF9zNC4yX1dTX2NvbXBsZXRlIDwtIG11dGF0ZShzdGF0X3M0LjJfV1NfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKc2V0XzQuMl9XU19iYXJzIDwtIGdncGxvdChzdGF0X3M0LjJfV1NfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfNC4yX1dTX2JhcnMgPC0gc2V0XzQuMl9XU19iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9ImxpZ2h0Z3JlZW4iKQpzZXRfNC4yX1dTX2JhcnMgPC0gc2V0XzQuMl9XU19iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfNC4yX1dTX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF80LjJfV1NfYmFycyA8LSBzZXRfNC4yX1dTX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlNob290IC0gRnJlc2ggV2VpZ2h0IChtZykiKQpzZXRfNC4yX1dTX2JhcnMgPC0gc2V0XzQuMl9XU19iYXJzICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BdmVyYWdlLVNFLCB5bWF4PUF2ZXJhZ2UrU0UpLCBzaXplPS41LCB3aWR0aD0uMikKc2V0XzQuMl9XU19iYXJzIDwtIHNldF80LjJfV1NfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF80LjJfV1NfYmFycyA8LSBzZXRfNC4yX1dTX2JhcnMgKyBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gImJvdHRvbSIsIGV4cGFuZCA9IGMoMCwwKSkKc2V0XzQuMl9XU19iYXJzIDwtIHNldF80LjJfV1NfYmFycyArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpCnNldF80LjJfV1NfYmFycyA8LSBzZXRfNC4yX1dTX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9MSwgeT01OTAsIGxhYmVsPSJTdHJldGNoIGl0IiksIHZqdXN0PS0xKQpzZXRfNC4yX1dTX2JhcnMKYGBgCgojIyMjIFdldCBSb290CgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCnN0YXRfczQuMl9XUl9jb21wbGV0ZSA8LSBzdGF0X3NldF80LjJfV1JbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfNC4yX1dSKSxdCgojIyBzZXQgdGhlIGNvbnRyb2wgdmFsdWUgZm9yIFdldCBSb290IG1nCnNldF80LjJfV1JfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3M0LjJfV1JfY29tcGxldGVbMjMsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3M0LjJfV1JfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczQuMl9XUl9jb21wbGV0ZVsyMyw1XSkKCnN0YXRfczQuMl9XUl9jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zNC4yX1dSX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF80LjJfV1JfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zNC4yX1dSX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzQuMl9XUl9iYXJzIDwtIHNldF80LjJfV1JfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJ0YW4iKQpzZXRfNC4yX1dSX2JhcnMgPC0gc2V0XzQuMl9XUl9iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfNC4yX1dSX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF80LjJfV1JfYmFycyA8LSBzZXRfNC4yX1dSX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlJvb3QgLSBGcmVzaCBXZWlnaHQgKG1nKSIpCnNldF80LjJfV1JfYmFycyA8LSBzZXRfNC4yX1dSX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQpzZXRfNC4yX1dSX2JhcnMgPC0gc2V0XzQuMl9XUl9iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzQuMl9XUl9iYXJzIDwtIHNldF80LjJfV1JfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfNC4yX1dSX2JhcnMgPC0gc2V0XzQuMl9XUl9iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDU5KSkKc2V0XzQuMl9XUl9iYXJzIDwtIHNldF80LjJfV1JfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzZdLCB5PTU1LCBsYWJlbD0iMzE3JSIpLCBoanVzdD0wLjM4KQpzZXRfNC4yX1dSX2JhcnMgPC0gc2V0XzQuMl9XUl9iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PWlzb2xhdGVbOF0sIHk9NTEsIGxhYmVsPSIzMDUlIiksIGhqdXN0PTAuMzgpCgpzZXRfNC4yX1dSX2JhcnMKYGBgCgojIyMjIENvd3Bsb3QgLSBTZXQgNC4yCmBgYHtyLCBmaWcud2lkdGg9MTB9CnNldF80LjJfd2V0X2dyaWQgPC0gcGxvdF9ncmlkKHNldF80LjJfV1NfYmFycyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzQuMl9XUl9iYXJzICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwgIkIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX3NpemUgPSAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICd2aCcpCnNldF80LjJfd2V0X2dyaWQKCmdnc2F2ZSgiLi9QbG90cy9zZXRfNC4yX3dldF9ncmlkLnBkZiIsIHNldF80LjJfd2V0X2dyaWQsIHdpZHRoID0gMTYsIGhlaWdodCA9IDE2KQoKYGBgCgojIyMgU2V0IDQuMwoKIyMjIyBXZXQgU2hvb3QKCmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKc3RhdF9zNC4zX1dTX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzQuM19XU1tjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF80LjNfV1MpLF0KCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgV2V0IFNob290IG1nCnNldF80LjNfV1NfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3M0LjNfV1NfY29tcGxldGVbMjUsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3M0LjNfV1NfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczQuM19XU19jb21wbGV0ZVsyNSw1XSkKCnN0YXRfczQuM19XU19jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zNC4zX1dTX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF80LjNfV1NfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zNC4zX1dTX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzQuM19XU19iYXJzIDwtIHNldF80LjNfV1NfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJsaWdodGdyZWVuIikKc2V0XzQuM19XU19iYXJzIDwtIHNldF80LjNfV1NfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzQuM19XU19jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfNC4zX1dTX2JhcnMgPC0gc2V0XzQuM19XU19iYXJzICsgbGFicyh4PSIiLCB5PSJTaG9vdCAtIEZyZXNoIFdlaWdodCAobWcpIikKc2V0XzQuM19XU19iYXJzIDwtIHNldF80LjNfV1NfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF80LjNfV1NfYmFycyA8LSBzZXRfNC4zX1dTX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfNC4zX1dTX2JhcnMgPC0gc2V0XzQuM19XU19iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF80LjNfV1NfYmFycyA8LSBzZXRfNC4zX1dTX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKQpzZXRfNC4zX1dTX2JhcnMgPC0gc2V0XzQuM19XU19iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PTEsIHk9NDk1LCBsYWJlbD0iU3RyZXRjaCBpdCIpLCB2anVzdD0tMSkKc2V0XzQuM19XU19iYXJzCmBgYAoKIyMjIyBXZXQgUm9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwpzdGF0X3M0LjNfV1JfY29tcGxldGUgPC0gc3RhdF9zZXRfNC4zX1dSW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzQuM19XUiksXQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBXZXQgUm9vdCBtZwpzZXRfNC4zX1dSX2NvbnRyb2xfaW50IDwtIGFzLm51bWVyaWMoc3RhdF9zNC4zX1dSX2NvbXBsZXRlWzI1LDVdKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zNC4zX1dSX2NvbXBsZXRlJGNvbnRyb2wgPC0gYXMubnVtZXJpYyhzdGF0X3M0LjNfV1JfY29tcGxldGVbMjUsNV0pCgpzdGF0X3M0LjNfV1JfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczQuM19XUl9jb21wbGV0ZSwgcF9jdHJsID0gKDEwMCogKEF2ZXJhZ2UgLyBjb250cm9sKSkpCgpzZXRfNC4zX1dSX2JhcnMgPC0gZ2dwbG90KHN0YXRfczQuM19XUl9jb21wbGV0ZSwgYWVzKHggPSBpc29sYXRlLCB5ID0gQXZlcmFnZSkpCnNldF80LjNfV1JfYmFycyA8LSBzZXRfNC4zX1dSX2JhcnMgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgc2l6ZT0uNSwgZmlsbD0idGFuIikKc2V0XzQuM19XUl9iYXJzIDwtIHNldF80LjNfV1JfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzQuM19XUl9jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfNC4zX1dSX2JhcnMgPC0gc2V0XzQuM19XUl9iYXJzICsgbGFicyh4PSIiLCB5PSJSb290IC0gRnJlc2ggV2VpZ2h0IChtZykiKQpzZXRfNC4zX1dSX2JhcnMgPC0gc2V0XzQuM19XUl9iYXJzICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BdmVyYWdlLVNFLCB5bWF4PUF2ZXJhZ2UrU0UpLCBzaXplPS41LCB3aWR0aD0uMikKc2V0XzQuM19XUl9iYXJzIDwtIHNldF80LjNfV1JfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF80LjNfV1JfYmFycyA8LSBzZXRfNC4zX1dSX2JhcnMgKyBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gImJvdHRvbSIsIGV4cGFuZCA9IGMoMCwwKSkKc2V0XzQuM19XUl9iYXJzIDwtIHNldF80LjNfV1JfYmFycyArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpCnNldF80LjNfV1JfYmFycyA8LSBzZXRfNC4zX1dSX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9MSwgeT00OSwgbGFiZWw9IiIpLCB2anVzdD0tMSkKc2V0XzQuM19XUl9iYXJzCmBgYAoKIyMjIyBDb3dwbG90IC0gU2V0IDQuMwpgYGB7ciwgZmlnLndpZHRoPTEwfQpzZXRfNC4zX3dldF9ncmlkIDwtIHBsb3RfZ3JpZChzZXRfNC4zX1dTX2JhcnMgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF80LjNfV1JfYmFycyArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQSIsICJCIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9zaXplID0gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAndmgnKQpzZXRfNC4zX3dldF9ncmlkCgpnZ3NhdmUoIi4vUGxvdHMvc2V0XzQuM193ZXRfZ3JpZC5wZGYiLCBzZXRfNC4zX3dldF9ncmlkLCB3aWR0aCA9IDE2LCBoZWlnaHQgPSAxNikKYGBgCgojIEFkZCBCYXRjaCBJRCB0byBEcnkgV2VpZ2h0IERhdGFmcmFtZXMKYGBge3J9CiMgYWRkIGJhdGNoIGlkIHZhcmlhYmxlIHRvIGVhY2ggZGF0YXNldAoKIyMgU2V0IDEKIyMjIERyeSBTaG9vdApzZXRfMV9EU19pZCA8LSBzZXRfMV9EUwpzZXRfMV9EU19pZCRiYXRjaCA8LSBjKCJTZXQgMSIpCgojIyMgRHJ5IFJvb3QKc2V0XzFfRFJfaWQgPC0gc2V0XzFfRFIKc2V0XzFfRFJfaWQkYmF0Y2ggPC0gYygiU2V0IDEiKQoKIyMgU2V0IDIuMQojIyMgRHJ5IFNob290CnNldF8yLjFfRFNfaWQgPC0gc2V0XzIuMV9EUwpzZXRfMi4xX0RTX2lkJGJhdGNoIDwtIGMoIlNldCAyLjEiKQoKIyMjIERyeSBSb290CnNldF8yLjFfRFJfaWQgPC0gc2V0XzIuMV9EUgpzZXRfMi4xX0RSX2lkJGJhdGNoIDwtIGMoIlNldCAyLjEiKQoKIyMgU2V0IDIuMgojIyMgRHJ5IFNob290CnNldF8yLjJfRFNfaWQgPC0gc2V0XzIuMl9EUwpzZXRfMi4yX0RTX2lkJGJhdGNoIDwtIGMoIlNldCAyLjIiKQoKIyMjIERyeSBSb290CnNldF8yLjJfRFJfaWQgPC0gc2V0XzIuMl9EUgpzZXRfMi4yX0RSX2lkJGJhdGNoIDwtIGMoIlNldCAyLjIiKQoKIyMgU2V0IDIuMwojIyMgRHJ5IFNob290CnNldF8yLjNfRFNfaWQgPC0gc2V0XzIuM19EUwpzZXRfMi4zX0RTX2lkJGJhdGNoIDwtIGMoIlNldCAyLjMiKQoKIyMjIERyeSBSb290CnNldF8yLjNfRFJfaWQgPC0gc2V0XzIuM19EUgpzZXRfMi4zX0RSX2lkJGJhdGNoIDwtIGMoIlNldCAyLjMiKQoKIyMgU2V0IDIuNAojIyMgRHJ5IFNob290CnNldF8yLjRfRFNfaWQgPC0gc2V0XzIuNF9EUwpzZXRfMi40X0RTX2lkJGJhdGNoIDwtIGMoIlNldCAyLjQiKQoKIyMjIERyeSBSb290CnNldF8yLjRfRFJfaWQgPC0gc2V0XzIuNF9EUgpzZXRfMi40X0RSX2lkJGJhdGNoIDwtIGMoIlNldCAyLjQiKQoKIyMgU2V0IDMuMQojIyMgRHJ5IFNob290CnNldF8zLjFfRFNfaWQgPC0gc2V0XzMuMV9EUwpzZXRfMy4xX0RTX2lkJGJhdGNoIDwtIGMoIlNldCAzLjEiKQoKIyMjIERyeSBSb290CnNldF8zLjFfRFJfaWQgPC0gc2V0XzMuMV9EUgpzZXRfMy4xX0RSX2lkJGJhdGNoIDwtIGMoIlNldCAzLjEiKQoKIyMgU2V0IDMuMgojIyMgRHJ5IFNob290CnNldF8zLjJfRFNfaWQgPC0gc2V0XzMuMl9EUwpzZXRfMy4yX0RTX2lkJGJhdGNoIDwtIGMoIlNldCAzLjIiKQoKIyMjIERyeSBSb290CnNldF8zLjJfRFJfaWQgPC0gc2V0XzMuMl9EUgpzZXRfMy4yX0RSX2lkJGJhdGNoIDwtIGMoIlNldCAzLjIiKQoKIyMgU2V0IDMuMwojIyMgRHJ5IFNob290CnNldF8zLjNfRFNfaWQgPC0gc2V0XzMuM19EUwpzZXRfMy4zX0RTX2lkJGJhdGNoIDwtIGMoIlNldCAzLjMiKQoKIyMjIERyeSBSb290CnNldF8zLjNfRFJfaWQgPC0gc2V0XzMuM19EUgpzZXRfMy4zX0RSX2lkJGJhdGNoIDwtIGMoIlNldCAzLjMiKQoKIyMgU2V0IDMuNAojIyMgRHJ5IFNob290CnNldF8zLjRfRFNfaWQgPC0gc2V0XzMuNF9EUwpzZXRfMy40X0RTX2lkJGJhdGNoIDwtIGMoIlNldCAzLjQiKQoKIyMjIERyeSBSb290CnNldF8zLjRfRFJfaWQgPC0gc2V0XzMuNF9EUgpzZXRfMy40X0RSX2lkJGJhdGNoIDwtIGMoIlNldCAzLjQiKQoKIyMgU2V0IDMuNQojIyMgRHJ5IFNob290CnNldF8zLjVfRFNfaWQgPC0gc2V0XzMuNV9EUwpzZXRfMy41X0RTX2lkJGJhdGNoIDwtIGMoIlNldCAzLjUiKQoKIyMjIERyeSBSb290CnNldF8zLjVfRFJfaWQgPC0gc2V0XzMuNV9EUgpzZXRfMy41X0RSX2lkJGJhdGNoIDwtIGMoIlNldCAzLjUiKQoKIyMgU2V0IDQuMQojIyMgRHJ5IFNob290CnNldF80LjFfRFNfaWQgPC0gc2V0XzQuMV9EUwpzZXRfNC4xX0RTX2lkJGJhdGNoIDwtIGMoIlNldCA0LjEiKQoKIyMjIERyeSBSb290CnNldF80LjFfRFJfaWQgPC0gc2V0XzQuMV9EUgpzZXRfNC4xX0RSX2lkJGJhdGNoIDwtIGMoIlNldCA0LjEiKQoKIyMgU2V0IDQuMgojIyMgRHJ5IFNob290CnNldF80LjJfRFNfaWQgPC0gc2V0XzQuMl9EUwpzZXRfNC4yX0RTX2lkJGJhdGNoIDwtIGMoIlNldCA0LjIiKQoKIyMjIERyeSBSb290CnNldF80LjJfRFJfaWQgPC0gc2V0XzQuMl9EUgpzZXRfNC4yX0RSX2lkJGJhdGNoIDwtIGMoIlNldCA0LjIiKQoKIyMgU2V0IDQuMwojIyMgRHJ5IFNob290CnNldF80LjNfRFNfaWQgPC0gc2V0XzQuM19EUwpzZXRfNC4zX0RTX2lkJGJhdGNoIDwtIGMoIlNldCA0LjMiKQoKIyMjIERyeSBSb290CnNldF80LjNfRFJfaWQgPC0gc2V0XzQuM19EUgpzZXRfNC4zX0RSX2lkJGJhdGNoIDwtIGMoIlNldCA0LjMiKQpgYGAKCiMgR3JvdXAgdGhlIERhdGEgZm9yIFBsb3R0aW5nCmBgYHtyfQojR3JvdXAgdGhlIGRhdGFzZXRzIGJhc2VkIG9uIFNhbXBsZSBJRCBhbmQgcHJlcCBtZXRob2QKCiMjIFNldCAxCnNldF8xX0RTX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzFfRFNfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCnNldF8xX0RSX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzFfRFJfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCgojIyBTZXQgMi4xCnNldF8yLjFfRFNfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfMi4xX0RTX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQpzZXRfMi4xX0RSX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzIuMV9EUl9pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKCiMjIFNldCAyLjIKc2V0XzIuMl9EU19ncm91cGVkIDwtIGdyb3VwX2J5KHNldF8yLjJfRFNfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCnNldF8yLjJfRFJfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfMi4yX0RSX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQoKIyMgU2V0IDIuMwpzZXRfMi4zX0RTX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzIuM19EU19pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKc2V0XzIuM19EUl9ncm91cGVkIDwtIGdyb3VwX2J5KHNldF8yLjNfRFJfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCgojIyBTZXQgMi40CnNldF8yLjRfRFNfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfMi40X0RTX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQpzZXRfMi40X0RSX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzIuNF9EUl9pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKCiMjIFNldCAzLjEKc2V0XzMuMV9EU19ncm91cGVkIDwtIGdyb3VwX2J5KHNldF8zLjFfRFNfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCnNldF8zLjFfRFJfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfMy4xX0RSX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQoKIyMgU2V0IDMuMgpzZXRfMy4yX0RTX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzMuMl9EU19pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKc2V0XzMuMl9EUl9ncm91cGVkIDwtIGdyb3VwX2J5KHNldF8zLjJfRFJfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCgojIyBTZXQgMy4zCnNldF8zLjNfRFNfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfMy4zX0RTX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQpzZXRfMy4zX0RSX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzMuM19EUl9pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKCiMjIFNldCAzLjQKc2V0XzMuNF9EU19ncm91cGVkIDwtIGdyb3VwX2J5KHNldF8zLjRfRFNfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCnNldF8zLjRfRFJfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfMy40X0RSX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQoKIyMgU2V0IDMuNQpzZXRfMy41X0RTX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzMuNV9EU19pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKc2V0XzMuNV9EUl9ncm91cGVkIDwtIGdyb3VwX2J5KHNldF8zLjVfRFJfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCgojIyBTZXQgNC4xCnNldF80LjFfRFNfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfNC4xX0RTX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQpzZXRfNC4xX0RSX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzQuMV9EUl9pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKCiMjIFNldCA0LjIKc2V0XzQuMl9EU19ncm91cGVkIDwtIGdyb3VwX2J5KHNldF80LjJfRFNfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCnNldF80LjJfRFJfZ3JvdXBlZCA8LSBncm91cF9ieShzZXRfNC4yX0RSX2lkLCBpc29sYXRlLCBzYW1wbGUsIGJhdGNoKQoKIyMgU2V0IDQuMwpzZXRfNC4zX0RTX2dyb3VwZWQgPC0gZ3JvdXBfYnkoc2V0XzQuM19EU19pZCwgaXNvbGF0ZSwgc2FtcGxlLCBiYXRjaCkKc2V0XzQuM19EUl9ncm91cGVkIDwtIGdyb3VwX2J5KHNldF80LjNfRFJfaWQsIGlzb2xhdGUsIHNhbXBsZSwgYmF0Y2gpCmBgYAoKIyBDb21wdXRlIHN0YXRzIG92ZXIgdHJpcGxpY2F0ZXMgZm9yIHBsb3R0aW5nCmBgYHtyfQoKIyBzZXQgMQpzdGF0X3NldF8xX0RTIDwtIHN1bW1hcmlzZShzZXRfMV9EU19ncm91cGVkLCBOPWxlbmd0aChtZyksIEF2ZXJhZ2U9bWVhbihtZywgbmEucm0gPSBUUlVFKSwgQ0k5NT1jb25mX2ludDk1KG1nKSwgU0U9c3RkX2Vycm9yKG1nKSkKc3RhdF9zZXRfMV9EUiA8LSBzdW1tYXJpc2Uoc2V0XzFfRFJfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAyLjEKc3RhdF9zZXRfMi4xX0RTIDwtIHN1bW1hcmlzZShzZXRfMi4xX0RTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8yLjFfRFIgPC0gc3VtbWFyaXNlKHNldF8yLjFfRFJfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAyLjIKc3RhdF9zZXRfMi4yX0RTIDwtIHN1bW1hcmlzZShzZXRfMi4yX0RTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8yLjJfRFIgPC0gc3VtbWFyaXNlKHNldF8yLjJfRFJfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAyLjMKc3RhdF9zZXRfMi4zX0RTIDwtIHN1bW1hcmlzZShzZXRfMi4zX0RTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8yLjNfRFIgPC0gc3VtbWFyaXNlKHNldF8yLjNfRFJfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAyLjQKc3RhdF9zZXRfMi40X0RTIDwtIHN1bW1hcmlzZShzZXRfMi40X0RTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8yLjRfRFIgPC0gc3VtbWFyaXNlKHNldF8yLjRfRFJfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAzLjEKc3RhdF9zZXRfMy4xX0RTIDwtIHN1bW1hcmlzZShzZXRfMy4xX0RTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8zLjFfRFIgPC0gc3VtbWFyaXNlKHNldF8zLjFfRFJfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAzLjIKc3RhdF9zZXRfMy4yX0RTIDwtIHN1bW1hcmlzZShzZXRfMy4yX0RTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8zLjJfRFIgPC0gc3VtbWFyaXNlKHNldF8zLjJfRFJfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAzLjMKc3RhdF9zZXRfMy4zX0RTIDwtIHN1bW1hcmlzZShzZXRfMy4zX0RTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8zLjNfRFIgPC0gc3VtbWFyaXNlKHNldF8zLjNfRFJfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAzLjQKc3RhdF9zZXRfMy40X0RTIDwtIHN1bW1hcmlzZShzZXRfMy40X0RTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8zLjRfRFIgPC0gc3VtbWFyaXNlKHNldF8zLjRfRFJfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCAzLjUKc3RhdF9zZXRfMy41X0RTIDwtIHN1bW1hcmlzZShzZXRfMy41X0RTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF8zLjVfRFIgPC0gc3VtbWFyaXNlKHNldF8zLjVfRFJfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCA0LjEKc3RhdF9zZXRfNC4xX0RTIDwtIHN1bW1hcmlzZShzZXRfNC4xX0RTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF80LjFfRFIgPC0gc3VtbWFyaXNlKHNldF80LjFfRFJfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCA0LjIKc3RhdF9zZXRfNC4yX0RTIDwtIHN1bW1hcmlzZShzZXRfNC4yX0RTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF80LjJfRFIgPC0gc3VtbWFyaXNlKHNldF80LjJfRFJfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCgojIHNldCA0LjMKc3RhdF9zZXRfNC4zX0RTIDwtIHN1bW1hcmlzZShzZXRfNC4zX0RTX2dyb3VwZWQsIE49bGVuZ3RoKG1nKSwgQXZlcmFnZT1tZWFuKG1nLCBuYS5ybSA9IFRSVUUpLCBDSTk1PWNvbmZfaW50OTUobWcpLCBTRT1zdGRfZXJyb3IobWcpKQpzdGF0X3NldF80LjNfRFIgPC0gc3VtbWFyaXNlKHNldF80LjNfRFJfZ3JvdXBlZCwgTj1sZW5ndGgobWcpLCBBdmVyYWdlPW1lYW4obWcsIG5hLnJtID0gVFJVRSksIENJOTU9Y29uZl9pbnQ5NShtZyksIFNFPXN0ZF9lcnJvcihtZykpCmBgYAoKIyMgRHJ5IFdlaWdodCBQbG90cwoKIyMjIFNldCAxCgojIyMjIERyeSBTaG9vdApgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBEcnkgU2hvb3QgbWcKc2V0XzFfRFNfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3NldF8xX0RTWzU4LDVdKQoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCgpzdGF0X3MxX0RTX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzFfRFNbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfMV9EUyksXQoKIyMgcmVtb3ZlIGNvbnRyb2wtV08KCnN0YXRfczFfRFNfY29tcGxldGUgPC0gZmlsdGVyKHN0YXRfczFfRFNfY29tcGxldGUsIGlzb2xhdGUgIT0gImNvbnRyb2wtV08iKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zMV9EU19jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zZXRfMV9EU1s1OCw1XSkKCnN0YXRfczFfRFNfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczFfRFNfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKIyMgTWFrZSB0aGUgcGxvdApzZXRfMV9EU19iYXJzIDwtIGdncGxvdChzdGF0X3MxX0RTX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzFfRFNfYmFycyA8LSBzZXRfMV9EU19iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9ImxpZ2h0Z3JlZW4iKQpzZXRfMV9EU19iYXJzIDwtIHNldF8xX0RTX2JhcnMgKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PXNldF8xX0RTX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8xX0RTX2JhcnMgPC0gc2V0XzFfRFNfYmFycyArIGxhYnMoeD0iIiwgeT0iU2hvb3QgLSBEcnkgV2VpZ2h0IChtZykiKQpzZXRfMV9EU19iYXJzIDwtIHNldF8xX0RTX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQojc2V0XzFfRFNfYmFycyA8LSBzZXRfMV9EU19iYXJzICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zcHJpbnRmKCIlMC4wZiIsIHJvdW5kKHBfY3RybCwgZGlnaXRzID0gMCkpLCB5PUF2ZXJhZ2UrU0UsIHZqdXN0PS0wLjUpLCBoanVzdCA9IDAsIGFuZ2xlID0gNDUpCnNldF8xX0RTX2JhcnMgPC0gc2V0XzFfRFNfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF8xX0RTX2JhcnMgPC0gc2V0XzFfRFNfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMV9EU19iYXJzIDwtIHNldF8xX0RTX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNDUpKQpzZXRfMV9EU19iYXJzIDwtIHNldF8xX0RTX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVsxMV0sIHk9NDIsIGxhYmVsPSIyMDUlIiksIGhqdXN0PTAuMzgpCnNldF8xX0RTX2JhcnMKYGBgCgojIyMjIERyeSBSb290CmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKc3RhdF9zMV9EUl9jb21wbGV0ZSA8LSBzdGF0X3NldF8xX0RSW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzFfRFIpLF0KCiMjIHJlbW92ZSBjb250cm9sLVdPCnN0YXRfczFfRFJfY29tcGxldGUgPC0gZmlsdGVyKHN0YXRfczFfRFJfY29tcGxldGUsIGlzb2xhdGUgIT0gImNvbnRyb2wtV08iKQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBEcnkgU2hvb3QgbWcKc2V0XzFfRFJfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MxX0RSX2NvbXBsZXRlWzM5LDVdKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zMV9EUl9jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zZXRfMV9EUls1OCw1XSkKCnN0YXRfczFfRFJfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczFfRFJfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKIyMgUGxvdAoKc2V0XzFfRFJfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMV9EUl9jb21wbGV0ZSwgYWVzKHggPSBpc29sYXRlLCB5ID0gQXZlcmFnZSkpCnNldF8xX0RSX2JhcnMgPC0gc2V0XzFfRFJfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJ0YW4iKQpzZXRfMV9EUl9iYXJzIDwtIHNldF8xX0RSX2JhcnMgKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PXNldF8xX0RSX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8xX0RSX2JhcnMgPC0gc2V0XzFfRFJfYmFycyArIGxhYnMoeD0iIiwgeT0iUm9vdCAtIERyeSBXZWlnaHQgKG1nKSIpCnNldF8xX0RSX2JhcnMgPC0gc2V0XzFfRFJfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF8xX0RSX2JhcnMgPC0gc2V0XzFfRFJfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF8xX0RSX2JhcnMgPC0gc2V0XzFfRFJfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMV9EUl9iYXJzIDwtIHNldF8xX0RSX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsMTkpKQpzZXRfMV9EUl9iYXJzIDwtIHNldF8xX0RSX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVsyN10sIHk9MTcsIGxhYmVsPSIyMDIlIiksIGhqdXN0PTAuMzgpCgpzZXRfMV9EUl9iYXJzCmBgYAoKIyMjIyBDb3dwbG90IC0gU2V0IDEgLSBGdWxsCmBgYHtyLCBmaWcud2lkdGg9MTB9CgpzZXRfMV9kcnlfZ3JpZCA8LSBwbG90X2dyaWQoc2V0XzFfRFNfYmFycyArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzFfRFJfYmFycyArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQyIsICJEIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9zaXplID0gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAndmgnKQoKc2V0XzFfZnVsbF9ncmlkIDwtIHBsb3RfZ3JpZChzZXRfMV93ZXRfZ3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfMV9kcnlfZ3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikKc2V0XzFfZnVsbF9ncmlkCgpnZ3NhdmUoIi4vUGxvdHMvc2V0XzFfZnVsbF9ncmlkLnBkZiIsIHNldF8xX2Z1bGxfZ3JpZCwgd2lkdGggPSAxNiwgaGVpZ2h0ID0gMTYpCgpgYGAKCiMjIyBTZXQgMi4xCgojIyMjIERyeSBTaG9vdApgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBEcnkgU2hvb3QgbWcKc2V0XzIuMV9EU19jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfc2V0XzIuMV9EU1szMyw1XSkKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwoKc3RhdF9zMi4xX0RTX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzIuMV9EU1tjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF8yLjFfRFMpLF0KCiMjIHJlbW92ZSBjb250cm9sLVdPCgpzdGF0X3MyLjFfRFNfY29tcGxldGUgPC0gZmlsdGVyKHN0YXRfczIuMV9EU19jb21wbGV0ZSwgaXNvbGF0ZSAhPSAiY29udHJvbC1XTyIpCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MyLjFfRFNfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfc2V0XzIuMV9EU1szMyw1XSkKCnN0YXRfczIuMV9EU19jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMi4xX0RTX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCiMjIE1ha2UgdGhlIHBsb3QKc2V0XzIuMV9EU19iYXJzIDwtIGdncGxvdChzdGF0X3MyLjFfRFNfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfMi4xX0RTX2JhcnMgPC0gc2V0XzIuMV9EU19iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9ImxpZ2h0Z3JlZW4iKQpzZXRfMi4xX0RTX2JhcnMgPC0gc2V0XzIuMV9EU19iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfMi4xX0RTX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8yLjFfRFNfYmFycyA8LSBzZXRfMi4xX0RTX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlNob290IC0gRHJ5IFdlaWdodCAobWcpIikKc2V0XzIuMV9EU19iYXJzIDwtIHNldF8yLjFfRFNfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCiNzZXRfMi4xX0RTX2JhcnMgPC0gc2V0XzIuMV9EU19iYXJzICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zcHJpbnRmKCIlMC4wZiIsIHJvdW5kKHBfY3RybCwgZGlnaXRzID0gMCkpLCB5PUF2ZXJhZ2UrU0UsIHZqdXN0PS0wLjUpLCBoanVzdCA9IDAsIGFuZ2xlID0gNDUpCnNldF8yLjFfRFNfYmFycyA8LSBzZXRfMi4xX0RTX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfMi4xX0RTX2JhcnMgPC0gc2V0XzIuMV9EU19iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF8yLjFfRFNfYmFycyA8LSBzZXRfMi4xX0RTX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNDUpKQpzZXRfMi4xX0RTX2JhcnMgPC0gc2V0XzIuMV9EU19iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PWlzb2xhdGVbMTJdLCB5PTQxLCBsYWJlbD0iMzIzJSIpLCBoanVzdD0wLjM4KQpzZXRfMi4xX0RTX2JhcnMKYGBgCgojIyMjIERyeSBSb290CmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyBzZXQgdGhlIGNvbnRyb2wgdmFsdWUgZm9yIERyeSBSb290IG1nCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKCnN0YXRfczIuMV9EUl9jb21wbGV0ZSA8LSBzdGF0X3NldF8yLjFfRFJbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfMi4xX0RSKSxdCgojIyByZW1vdmUgY29udHJvbC1XTwoKc3RhdF9zMi4xX0RSX2NvbXBsZXRlIDwtIGZpbHRlcihzdGF0X3MyLjFfRFJfY29tcGxldGUsIGlzb2xhdGUgIT0gImNvbnRyb2wtV08iKQoKc2V0XzIuMV9EUl9jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfczIuMV9EUl9jb21wbGV0ZVszMSw1XSkKCiMjIGNhbGN1bGF0ZSAlIGNvbnRyb2wgZm9yIGVhY2ggdHJlYXRtZW50CnN0YXRfczIuMV9EUl9jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zZXRfMi4xX0RSWzMxLDVdKQoKc3RhdF9zMi4xX0RSX2NvbXBsZXRlIDwtIG11dGF0ZShzdGF0X3MyLjFfRFJfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKIyMgUGxvdAoKc2V0XzIuMV9EUl9iYXJzIDwtIGdncGxvdChzdGF0X3MyLjFfRFJfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfMi4xX0RSX2JhcnMgPC0gc2V0XzIuMV9EUl9iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9InRhbiIpCnNldF8yLjFfRFJfYmFycyA8LSBzZXRfMi4xX0RSX2JhcnMgKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PXNldF8yLjFfRFJfY29udHJvbF9pbnQpLCBjb2xvdXI9IiM5OTAwMDAiLCBsaW5ldHlwZT0iZGFzaGVkIikKc2V0XzIuMV9EUl9iYXJzIDwtIHNldF8yLjFfRFJfYmFycyArIGxhYnMoeD0iIiwgeT0iUm9vdCAtIERyeSBXZWlnaHQgKG1nKSIpCnNldF8yLjFfRFJfYmFycyA8LSBzZXRfMi4xX0RSX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQpzZXRfMi4xX0RSX2JhcnMgPC0gc2V0XzIuMV9EUl9iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzIuMV9EUl9iYXJzIDwtIHNldF8yLjFfRFJfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMi4xX0RSX2JhcnMgPC0gc2V0XzIuMV9EUl9iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDExLjUpKQpzZXRfMi4xX0RSX2JhcnMgPC0gc2V0XzIuMV9EUl9iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PWlzb2xhdGVbMjRdLCB5PTEwLjUsIGxhYmVsPSIxOTAlIiksIGhqdXN0PTAuMzgpCnNldF8yLjFfRFJfYmFycyA8LSBzZXRfMi4xX0RSX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVsyMV0sIHk9MTAsIGxhYmVsPSIxODIlIiksIGhqdXN0PTAuMzgpCgpzZXRfMi4xX0RSX2JhcnMKYGBgCgojIyMjIENvd3Bsb3QgLSBTZXQgMi4xIC0gRnVsbApgYGB7ciwgZmlnLndpZHRoPTEwfQpzZXRfMi4xX2RyeV9ncmlkIDwtIHBsb3RfZ3JpZChzZXRfMi4xX0RTX2JhcnMgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF8yLjFfRFJfYmFycyArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQyIsICJEIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9zaXplID0gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAndmgnKQoKc2V0XzIuMV9mdWxsX2dyaWQgPC0gcGxvdF9ncmlkKHNldF8yLjFfd2V0X2dyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzIuMV9kcnlfZ3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikKc2V0XzIuMV9mdWxsX2dyaWQKCmdnc2F2ZSgiLi9QbG90cy9zZXRfMi4xX2Z1bGxfZ3JpZC5wZGYiLCBzZXRfMi4xX2Z1bGxfZ3JpZCwgd2lkdGggPSAxNiwgaGVpZ2h0ID0gMTYpCgpgYGAKCiMjIyBTZXQgMi4yCgojIyMjIERyeSBTaG9vdApgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBEcnkgU2hvb3QgbWcKc2V0XzIuMl9EU19jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfc2V0XzIuMl9EU1szMyw1XSkKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwoKc3RhdF9zMi4yX0RTX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzIuMl9EU1tjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF8yLjJfRFMpLF0KCiMjIHJlbW92ZSBjb250cm9sLVdPCgpzdGF0X3MyLjJfRFNfY29tcGxldGUgPC0gZmlsdGVyKHN0YXRfczIuMl9EU19jb21wbGV0ZSwgaXNvbGF0ZSAhPSAiY29udHJvbC1XTyIpCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MyLjJfRFNfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfc2V0XzIuMl9EU1szMyw1XSkKCnN0YXRfczIuMl9EU19jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMi4yX0RTX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCiMjIE1ha2UgdGhlIHBsb3QKc2V0XzIuMl9EU19iYXJzIDwtIGdncGxvdChzdGF0X3MyLjJfRFNfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfMi4yX0RTX2JhcnMgPC0gc2V0XzIuMl9EU19iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9ImxpZ2h0Z3JlZW4iKQpzZXRfMi4yX0RTX2JhcnMgPC0gc2V0XzIuMl9EU19iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfMi4yX0RTX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8yLjJfRFNfYmFycyA8LSBzZXRfMi4yX0RTX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlNob290IC0gRHJ5IFdlaWdodCAobWcpIikKc2V0XzIuMl9EU19iYXJzIDwtIHNldF8yLjJfRFNfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCiNzZXRfMi4yX0RTX2JhcnMgPC0gc2V0XzIuMl9EU19iYXJzICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zcHJpbnRmKCIlMC4wZiIsIHJvdW5kKHBfY3RybCwgZGlnaXRzID0gMCkpLCB5PUF2ZXJhZ2UrU0UsIHZqdXN0PS0wLjUpLCBoanVzdCA9IDAsIGFuZ2xlID0gNDUpCnNldF8yLjJfRFNfYmFycyA8LSBzZXRfMi4yX0RTX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfMi4yX0RTX2JhcnMgPC0gc2V0XzIuMl9EU19iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF8yLjJfRFNfYmFycyA8LSBzZXRfMi4yX0RTX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNjUpKQpzZXRfMi4yX0RTX2JhcnMgPC0gc2V0XzIuMl9EU19iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PWlzb2xhdGVbMjZdLCB5PTYxLCBsYWJlbD0iMzE4JSIpLCBoanVzdD0wLjM4KQpzZXRfMi4yX0RTX2JhcnMKYGBgCgojIyMjIERyeSBSb290CgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBEcnkgUm9vdCBtZwoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCgpzdGF0X3MyLjJfRFJfY29tcGxldGUgPC0gc3RhdF9zZXRfMi4yX0RSW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzIuMl9EUiksXQoKIyMgcmVtb3ZlIGNvbnRyb2wtV08KCnN0YXRfczIuMl9EUl9jb21wbGV0ZSA8LSBmaWx0ZXIoc3RhdF9zMi4yX0RSX2NvbXBsZXRlLCBpc29sYXRlICE9ICJjb250cm9sLVdPIikKCnNldF8yLjJfRFJfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MyLjJfRFJfY29tcGxldGVbMzIsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MyLjJfRFJfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfc2V0XzIuMl9EUlszMiw1XSkKCnN0YXRfczIuMl9EUl9jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMi4yX0RSX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCiMjIFBsb3QKCnNldF8yLjJfRFJfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMi4yX0RSX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzIuMl9EUl9iYXJzIDwtIHNldF8yLjJfRFJfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJ0YW4iKQpzZXRfMi4yX0RSX2JhcnMgPC0gc2V0XzIuMl9EUl9iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfMi4yX0RSX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8yLjJfRFJfYmFycyA8LSBzZXRfMi4yX0RSX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlJvb3QgLSBEcnkgV2VpZ2h0IChtZykiKQpzZXRfMi4yX0RSX2JhcnMgPC0gc2V0XzIuMl9EUl9iYXJzICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BdmVyYWdlLVNFLCB5bWF4PUF2ZXJhZ2UrU0UpLCBzaXplPS41LCB3aWR0aD0uMikKc2V0XzIuMl9EUl9iYXJzIDwtIHNldF8yLjJfRFJfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF8yLjJfRFJfYmFycyA8LSBzZXRfMi4yX0RSX2JhcnMgKyBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gImJvdHRvbSIsIGV4cGFuZCA9IGMoMCwwKSkKc2V0XzIuMl9EUl9iYXJzIDwtIHNldF8yLjJfRFJfYmFycyArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCwxMy44KSkKc2V0XzIuMl9EUl9iYXJzIDwtIHNldF8yLjJfRFJfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzI2XSwgeT0xMywgbGFiZWw9IjIzNyUiKSwgaGp1c3Q9MC4zOCkKCnNldF8yLjJfRFJfYmFycwpgYGAKCiMjIyBDb3dwbG90IC0gU2V0IDIuMiAtIEZ1bGwKYGBge3IsIGZpZy53aWR0aD0xMH0Kc2V0XzIuMl9kcnlfZ3JpZCA8LSBwbG90X2dyaWQoc2V0XzIuMl9EU19iYXJzICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfMi4yX0RSX2JhcnMgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkMiLCAiRCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfc2l6ZSA9IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gJ3ZoJykKCnNldF8yLjJfZnVsbF9ncmlkIDwtIHBsb3RfZ3JpZChzZXRfMi4yX3dldF9ncmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF8yLjJfZHJ5X2dyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpCnNldF8yLjJfZnVsbF9ncmlkCgpnZ3NhdmUoIi4vUGxvdHMvc2V0XzIuMl9mdWxsX2dyaWQucGRmIiwgc2V0XzIuMl9mdWxsX2dyaWQsIHdpZHRoID0gMTYsIGhlaWdodCA9IDE2KQoKYGBgCgojIyMgU2V0IDIuMwoKIyMjIyBEcnkgU2hvb3QKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgRHJ5IFNob290IG1nCnNldF8yLjNfRFNfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3NldF8yLjNfRFNbMjgsNV0pCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKCnN0YXRfczIuM19EU19jb21wbGV0ZSA8LSBzdGF0X3NldF8yLjNfRFNbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfMi4zX0RTKSxdCgojIyByZW1vdmUgY29udHJvbC1XTwoKc3RhdF9zMi4zX0RTX2NvbXBsZXRlIDwtIGZpbHRlcihzdGF0X3MyLjNfRFNfY29tcGxldGUsIGlzb2xhdGUgIT0gImNvbnRyb2wtV08iKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zMi4zX0RTX2NvbXBsZXRlJGNvbnRyb2wgPC0gYXMubnVtZXJpYyhzdGF0X3NldF8yLjNfRFNbMjgsNV0pCgpzdGF0X3MyLjNfRFNfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczIuM19EU19jb21wbGV0ZSwgcF9jdHJsID0gKDEwMCogKEF2ZXJhZ2UgLyBjb250cm9sKSkpCgojIyBNYWtlIHRoZSBwbG90CnNldF8yLjNfRFNfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMi4zX0RTX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzIuM19EU19iYXJzIDwtIHNldF8yLjNfRFNfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJsaWdodGdyZWVuIikKc2V0XzIuM19EU19iYXJzIDwtIHNldF8yLjNfRFNfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzIuM19EU19jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfMi4zX0RTX2JhcnMgPC0gc2V0XzIuM19EU19iYXJzICsgbGFicyh4PSIiLCB5PSJTaG9vdCAtIERyeSBXZWlnaHQgKG1nKSIpCnNldF8yLjNfRFNfYmFycyA8LSBzZXRfMi4zX0RTX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQojc2V0XzIuM19EU19iYXJzIDwtIHNldF8yLjNfRFNfYmFycyArIGdlb21fdGV4dChhZXMobGFiZWw9c3ByaW50ZigiJTAuMGYiLCByb3VuZChwX2N0cmwsIGRpZ2l0cyA9IDApKSwgeT1BdmVyYWdlK1NFLCB2anVzdD0tMC41KSwgaGp1c3QgPSAwLCBhbmdsZSA9IDQ1KQpzZXRfMi4zX0RTX2JhcnMgPC0gc2V0XzIuM19EU19iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzIuM19EU19iYXJzIDwtIHNldF8yLjNfRFNfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMi4zX0RTX2JhcnMgPC0gc2V0XzIuM19EU19iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDQ1KSkKI3NldF8yLjNfRFNfYmFycyA8LSBzZXRfMi4zX0RTX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVsyNl0sIHk9NjEsIGxhYmVsPSIzMTglIiksIGhqdXN0PTAuMzgpCnNldF8yLjNfRFNfYmFycwpgYGAKIyMjIyBEcnkgUm9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgRHJ5IFJvb3QgbWcKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwoKc3RhdF9zMi4zX0RSX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzIuM19EUltjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF8yLjNfRFIpLF0KCiMjIHJlbW92ZSBjb250cm9sLVdPCgpzdGF0X3MyLjNfRFJfY29tcGxldGUgPC0gZmlsdGVyKHN0YXRfczIuM19EUl9jb21wbGV0ZSwgaXNvbGF0ZSAhPSAiY29udHJvbC1XTyIpCgpzZXRfMi4zX0RSX2NvbnRyb2xfaW50IDwtIGFzLm51bWVyaWMoc3RhdF9zMi4zX0RSX2NvbXBsZXRlWzI1LDVdKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zMi4zX0RSX2NvbXBsZXRlJGNvbnRyb2wgPC0gYXMubnVtZXJpYyhzdGF0X3NldF8yLjNfRFJbMjUsNV0pCgpzdGF0X3MyLjNfRFJfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczIuM19EUl9jb21wbGV0ZSwgcF9jdHJsID0gKDEwMCogKEF2ZXJhZ2UgLyBjb250cm9sKSkpCgojIyBQbG90CgpzZXRfMi4zX0RSX2JhcnMgPC0gZ2dwbG90KHN0YXRfczIuM19EUl9jb21wbGV0ZSwgYWVzKHggPSBpc29sYXRlLCB5ID0gQXZlcmFnZSkpCnNldF8yLjNfRFJfYmFycyA8LSBzZXRfMi4zX0RSX2JhcnMgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgc2l6ZT0uNSwgZmlsbD0idGFuIikKc2V0XzIuM19EUl9iYXJzIDwtIHNldF8yLjNfRFJfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzIuM19EUl9jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfMi4zX0RSX2JhcnMgPC0gc2V0XzIuM19EUl9iYXJzICsgbGFicyh4PSIiLCB5PSJSb290IC0gRHJ5IFdlaWdodCAobWcpIikKc2V0XzIuM19EUl9iYXJzIDwtIHNldF8yLjNfRFJfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF8yLjNfRFJfYmFycyA8LSBzZXRfMi4zX0RSX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfMi4zX0RSX2JhcnMgPC0gc2V0XzIuM19EUl9iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF8yLjNfRFJfYmFycyA8LSBzZXRfMi4zX0RSX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsMTcuNSkpCiNzZXRfMi4zX0RSX2JhcnMgPC0gc2V0XzIuM19EUl9iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PWlzb2xhdGVbMjZdLCB5PTEzLCBsYWJlbD0iMjM3JSIpLCBoanVzdD0wLjM4KQoKc2V0XzIuM19EUl9iYXJzCmBgYAoKIyMjIENvd3Bsb3QgLSBTZXQgMi4zIC0gRnVsbApgYGB7ciwgZmlnLndpZHRoPTEwfQpzZXRfMi4zX2RyeV9ncmlkIDwtIHBsb3RfZ3JpZChzZXRfMi4zX0RTX2JhcnMgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF8yLjNfRFJfYmFycyArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQyIsICJEIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9zaXplID0gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAndmgnKQoKc2V0XzIuM19mdWxsX2dyaWQgPC0gcGxvdF9ncmlkKHNldF8yLjNfd2V0X2dyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzIuM19kcnlfZ3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikKc2V0XzIuM19mdWxsX2dyaWQKCmdnc2F2ZSgiLi9QbG90cy9zZXRfMi4zX2Z1bGxfZ3JpZC5wZGYiLCBzZXRfMi4zX2Z1bGxfZ3JpZCwgd2lkdGggPSAxNiwgaGVpZ2h0ID0gMTYpCgpgYGAKCiMjIyBTZXQgMi40CgojIyMjIERyeSBTaG9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgRHJ5IFNob290IG1nCnNldF8yLjRfRFNfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3NldF8yLjRfRFNbMzcsNV0pCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKCnN0YXRfczIuNF9EU19jb21wbGV0ZSA8LSBzdGF0X3NldF8yLjRfRFNbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfMi40X0RTKSxdCgojIyByZW1vdmUgY29udHJvbC1XTwoKc3RhdF9zMi40X0RTX2NvbXBsZXRlIDwtIGZpbHRlcihzdGF0X3MyLjRfRFNfY29tcGxldGUsIGlzb2xhdGUgIT0gImNvbnRyb2wtV08iKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zMi40X0RTX2NvbXBsZXRlJGNvbnRyb2wgPC0gYXMubnVtZXJpYyhzdGF0X3NldF8yLjRfRFNbMzcsNV0pCgpzdGF0X3MyLjRfRFNfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczIuNF9EU19jb21wbGV0ZSwgcF9jdHJsID0gKDEwMCogKEF2ZXJhZ2UgLyBjb250cm9sKSkpCgojIyBNYWtlIHRoZSBwbG90CnNldF8yLjRfRFNfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMi40X0RTX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzIuNF9EU19iYXJzIDwtIHNldF8yLjRfRFNfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJsaWdodGdyZWVuIikKc2V0XzIuNF9EU19iYXJzIDwtIHNldF8yLjRfRFNfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzIuNF9EU19jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfMi40X0RTX2JhcnMgPC0gc2V0XzIuNF9EU19iYXJzICsgbGFicyh4PSIiLCB5PSJTaG9vdCAtIERyeSBXZWlnaHQgKG1nKSIpCnNldF8yLjRfRFNfYmFycyA8LSBzZXRfMi40X0RTX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQojc2V0XzIuNF9EU19iYXJzIDwtIHNldF8yLjRfRFNfYmFycyArIGdlb21fdGV4dChhZXMobGFiZWw9c3ByaW50ZigiJTAuMGYiLCByb3VuZChwX2N0cmwsIGRpZ2l0cyA9IDApKSwgeT1BdmVyYWdlK1NFLCB2anVzdD0tMC41KSwgaGp1c3QgPSAwLCBhbmdsZSA9IDQ1KQpzZXRfMi40X0RTX2JhcnMgPC0gc2V0XzIuNF9EU19iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzIuNF9EU19iYXJzIDwtIHNldF8yLjRfRFNfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMi40X0RTX2JhcnMgPC0gc2V0XzIuNF9EU19iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDU1KSkKc2V0XzIuNF9EU19iYXJzIDwtIHNldF8yLjRfRFNfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzI1XSwgeT01MSwgbGFiZWw9IjI1MSUiKSwgaGp1c3Q9MC4zOCkKc2V0XzIuNF9EU19iYXJzIDwtIHNldF8yLjRfRFNfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzM0XSwgeT00NywgbGFiZWw9IjI2MiUiKSwgaGp1c3Q9MC4zOCkKCnNldF8yLjRfRFNfYmFycwpgYGAKIyMjIyBEcnkgUm9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgRHJ5IFJvb3QgbWcKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwoKc3RhdF9zMi40X0RSX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzIuNF9EUltjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF8yLjRfRFIpLF0KCiMjIHJlbW92ZSBjb250cm9sLVdPCgpzdGF0X3MyLjRfRFJfY29tcGxldGUgPC0gZmlsdGVyKHN0YXRfczIuNF9EUl9jb21wbGV0ZSwgaXNvbGF0ZSAhPSAiY29udHJvbC1XTyIpCgpzZXRfMi40X0RSX2NvbnRyb2xfaW50IDwtIGFzLm51bWVyaWMoc3RhdF9zMi40X0RSX2NvbXBsZXRlWzM2LDVdKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zMi40X0RSX2NvbXBsZXRlJGNvbnRyb2wgPC0gYXMubnVtZXJpYyhzdGF0X3NldF8yLjRfRFJbMzYsNV0pCgpzdGF0X3MyLjRfRFJfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczIuNF9EUl9jb21wbGV0ZSwgcF9jdHJsID0gKDEwMCogKEF2ZXJhZ2UgLyBjb250cm9sKSkpCgojIyBQbG90CgpzZXRfMi40X0RSX2JhcnMgPC0gZ2dwbG90KHN0YXRfczIuNF9EUl9jb21wbGV0ZSwgYWVzKHggPSBpc29sYXRlLCB5ID0gQXZlcmFnZSkpCnNldF8yLjRfRFJfYmFycyA8LSBzZXRfMi40X0RSX2JhcnMgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgc2l6ZT0uNSwgZmlsbD0idGFuIikKc2V0XzIuNF9EUl9iYXJzIDwtIHNldF8yLjRfRFJfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzIuNF9EUl9jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfMi40X0RSX2JhcnMgPC0gc2V0XzIuNF9EUl9iYXJzICsgbGFicyh4PSIiLCB5PSJSb290IC0gRHJ5IFdlaWdodCAobWcpIikKc2V0XzIuNF9EUl9iYXJzIDwtIHNldF8yLjRfRFJfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF8yLjRfRFJfYmFycyA8LSBzZXRfMi40X0RSX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfMi40X0RSX2JhcnMgPC0gc2V0XzIuNF9EUl9iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF8yLjRfRFJfYmFycyA8LSBzZXRfMi40X0RSX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsMTQpKQpzZXRfMi40X0RSX2JhcnMgPC0gc2V0XzIuNF9EUl9iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PWlzb2xhdGVbMzRdLCB5PTEwLCBsYWJlbD0iMTk4JSIpLCBoanVzdD0wLjM4KQoKc2V0XzIuNF9EUl9iYXJzCmBgYAoKIyMjIENvd3Bsb3QgLSBTZXQgMi40IC0gRnVsbApgYGB7ciwgZmlnLndpZHRoPTEwfQpzZXRfMi40X2RyeV9ncmlkIDwtIHBsb3RfZ3JpZChzZXRfMi40X0RTX2JhcnMgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF8yLjRfRFJfYmFycyArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQyIsICJEIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9zaXplID0gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAndmgnKQoKc2V0XzIuNF9mdWxsX2dyaWQgPC0gcGxvdF9ncmlkKHNldF8yLjRfd2V0X2dyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzIuNF9kcnlfZ3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikKc2V0XzIuNF9mdWxsX2dyaWQKCmdnc2F2ZSgiLi9QbG90cy9zZXRfMi40X2Z1bGxfZ3JpZC5wZGYiLCBzZXRfMi40X2Z1bGxfZ3JpZCwgd2lkdGggPSAxNiwgaGVpZ2h0ID0gMTYpCgpgYGAKCiMjIyBTZXQgMy4xCgojIyMjIERyeSBTaG9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwoKc3RhdF9zMy4xX0RTX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzMuMV9EU1tjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF8zLjFfRFMpLF0KCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgRHJ5IFNob290IG1nCgpzZXRfMy4xX0RTX2NvbnRyb2xfaW50IDwtIGFzLm51bWVyaWMoc3RhdF9zMy4xX0RTX2NvbXBsZXRlWzM2LDVdKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zMy4xX0RTX2NvbXBsZXRlJGNvbnRyb2wgPC0gYXMubnVtZXJpYyhzdGF0X3MzLjFfRFNfY29tcGxldGVbMzYsNV0pCgpzdGF0X3MzLjFfRFNfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczMuMV9EU19jb21wbGV0ZSwgcF9jdHJsID0gKDEwMCogKEF2ZXJhZ2UgLyBjb250cm9sKSkpCgpzZXRfMy4xX0RTX2JhcnMgPC0gZ2dwbG90KHN0YXRfczMuMV9EU19jb21wbGV0ZSwgYWVzKHggPSBpc29sYXRlLCB5ID0gQXZlcmFnZSkpCnNldF8zLjFfRFNfYmFycyA8LSBzZXRfMy4xX0RTX2JhcnMgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgc2l6ZT0uNSwgZmlsbD0ibGlnaHRncmVlbiIpCnNldF8zLjFfRFNfYmFycyA8LSBzZXRfMy4xX0RTX2JhcnMgKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PXNldF8zLjFfRFNfY29udHJvbF9pbnQpLCBjb2xvdXI9IiM5OTAwMDAiLCBsaW5ldHlwZT0iZGFzaGVkIikKc2V0XzMuMV9EU19iYXJzIDwtIHNldF8zLjFfRFNfYmFycyArIGxhYnMoeD0iIiwgeT0iU2hvb3QgLSBEcnkgV2VpZ2h0IChtZykiKQpzZXRfMy4xX0RTX2JhcnMgPC0gc2V0XzMuMV9EU19iYXJzICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BdmVyYWdlLVNFLCB5bWF4PUF2ZXJhZ2UrU0UpLCBzaXplPS41LCB3aWR0aD0uMikKc2V0XzMuMV9EU19iYXJzIDwtIHNldF8zLjFfRFNfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF8zLjFfRFNfYmFycyA8LSBzZXRfMy4xX0RTX2JhcnMgKyBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gImJvdHRvbSIsIGV4cGFuZCA9IGMoMCwwKSkKc2V0XzMuMV9EU19iYXJzIDwtIHNldF8zLjFfRFNfYmFycyArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCw0NSkpCiNzZXRfMy4xX0RTX2JhcnMgPC0gc2V0XzMuMV9EU19iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PWlzb2xhdGVbMThdLCB5PTgxNCwgbGFiZWw9IjIzMyUiKSwgaGp1c3Q9MC4zOCkKc2V0XzMuMV9EU19iYXJzIDwtIHNldF8zLjFfRFNfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzMzXSwgeT0zNiwgbGFiZWw9IjI3NyUiKSwgaGp1c3Q9MC4zOCkKc2V0XzMuMV9EU19iYXJzCmBgYAoKIyMjIyBEcnkgUm9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwpzdGF0X3MzLjFfRFJfY29tcGxldGUgPC0gc3RhdF9zZXRfMy4xX0RSW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzMuMV9EUiksXQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBEcnkgU2hvb3QgbWcKc2V0XzMuMV9EUl9jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfczMuMV9EUl9jb21wbGV0ZVszNiw1XSkKCiMjIGNhbGN1bGF0ZSAlIGNvbnRyb2wgZm9yIGVhY2ggdHJlYXRtZW50CnN0YXRfczMuMV9EUl9jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zMy4xX0RSX2NvbXBsZXRlWzM2LDVdKQoKc3RhdF9zMy4xX0RSX2NvbXBsZXRlIDwtIG11dGF0ZShzdGF0X3MzLjFfRFJfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKc2V0XzMuMV9EUl9iYXJzIDwtIGdncGxvdChzdGF0X3MzLjFfRFJfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfMy4xX0RSX2JhcnMgPC0gc2V0XzMuMV9EUl9iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9InRhbiIpCnNldF8zLjFfRFJfYmFycyA8LSBzZXRfMy4xX0RSX2JhcnMgKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PXNldF8zLjFfRFJfY29udHJvbF9pbnQpLCBjb2xvdXI9IiM5OTAwMDAiLCBsaW5ldHlwZT0iZGFzaGVkIikKc2V0XzMuMV9EUl9iYXJzIDwtIHNldF8zLjFfRFJfYmFycyArIGxhYnMoeD0iIiwgeT0iUm9vdCAtIERyeSBXZWlnaHQgKG1nKSIpCnNldF8zLjFfRFJfYmFycyA8LSBzZXRfMy4xX0RSX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQpzZXRfMy4xX0RSX2JhcnMgPC0gc2V0XzMuMV9EUl9iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzMuMV9EUl9iYXJzIDwtIHNldF8zLjFfRFJfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMy4xX0RSX2JhcnMgPC0gc2V0XzMuMV9EUl9iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDcuOSkpCnNldF8zLjFfRFJfYmFycyA8LSBzZXRfMy4xX0RSX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVsxOF0sIHk9NiwgbGFiZWw9IjIxMSUiKSwgaGp1c3Q9MC4zOCkKc2V0XzMuMV9EUl9iYXJzIDwtIHNldF8zLjFfRFJfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzIzXSwgeT03LjcsIGxhYmVsPSIyNTAlIiksIGhqdXN0PTAuMzgpCgpzZXRfMy4xX0RSX2JhcnMKYGBgCgojIyMgQ293cGxvdCAtIFNldCAzLjEgLSBGdWxsCmBgYHtyLCBmaWcud2lkdGg9MTB9CnNldF8zLjFfZHJ5X2dyaWQgPC0gcGxvdF9ncmlkKHNldF8zLjFfRFNfYmFycyArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzMuMV9EUl9iYXJzICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDIiwgIkQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX3NpemUgPSAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICd2aCcpCgpzZXRfMy4xX2Z1bGxfZ3JpZCA8LSBwbG90X2dyaWQoc2V0XzMuMV93ZXRfZ3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfMy4xX2RyeV9ncmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKQpzZXRfMy4xX2Z1bGxfZ3JpZAoKZ2dzYXZlKCIuL1Bsb3RzL3NldF8zLjFfZnVsbF9ncmlkLnBkZiIsIHNldF8zLjFfZnVsbF9ncmlkLCB3aWR0aCA9IDE2LCBoZWlnaHQgPSAxNikKCmBgYAoKIyMjIFNldCAzLjIKCiMjIyMgRHJ5IFNob290CgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCgpzdGF0X3MzLjJfRFNfY29tcGxldGUgPC0gc3RhdF9zZXRfMy4yX0RTW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzMuMl9EUyksXQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBEcnkgU2hvb3QgbWcKCnNldF8zLjJfRFNfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MzLjJfRFNfY29tcGxldGVbMjQsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MzLjJfRFNfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczMuMl9EU19jb21wbGV0ZVsyNCw1XSkKCnN0YXRfczMuMl9EU19jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMy4yX0RTX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF8zLjJfRFNfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMy4yX0RTX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzMuMl9EU19iYXJzIDwtIHNldF8zLjJfRFNfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJsaWdodGdyZWVuIikKc2V0XzMuMl9EU19iYXJzIDwtIHNldF8zLjJfRFNfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzMuMl9EU19jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfMy4yX0RTX2JhcnMgPC0gc2V0XzMuMl9EU19iYXJzICsgbGFicyh4PSIiLCB5PSJTaG9vdCAtIERyeSBXZWlnaHQgKG1nKSIpCnNldF8zLjJfRFNfYmFycyA8LSBzZXRfMy4yX0RTX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQpzZXRfMy4yX0RTX2JhcnMgPC0gc2V0XzMuMl9EU19iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzMuMl9EU19iYXJzIDwtIHNldF8zLjJfRFNfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMy4yX0RTX2JhcnMgPC0gc2V0XzMuMl9EU19iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDI5KSkKCnNldF8zLjJfRFNfYmFycwpgYGAKCiMjIyMgRHJ5IFJvb3QKCmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKc3RhdF9zMy4yX0RSX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzMuMl9EUltjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF8zLjJfRFIpLF0KCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgRHJ5IFNob290IG1nCnNldF8zLjJfRFJfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MzLjJfRFJfY29tcGxldGVbMjQsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MzLjJfRFJfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczMuMl9EUl9jb21wbGV0ZVsyNCw1XSkKCnN0YXRfczMuMl9EUl9jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMy4yX0RSX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF8zLjJfRFJfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMy4yX0RSX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzMuMl9EUl9iYXJzIDwtIHNldF8zLjJfRFJfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJ0YW4iKQpzZXRfMy4yX0RSX2JhcnMgPC0gc2V0XzMuMl9EUl9iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfMy4yX0RSX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8zLjJfRFJfYmFycyA8LSBzZXRfMy4yX0RSX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlJvb3QgLSBEcnkgV2VpZ2h0IChtZykiKQpzZXRfMy4yX0RSX2JhcnMgPC0gc2V0XzMuMl9EUl9iYXJzICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BdmVyYWdlLVNFLCB5bWF4PUF2ZXJhZ2UrU0UpLCBzaXplPS41LCB3aWR0aD0uMikKc2V0XzMuMl9EUl9iYXJzIDwtIHNldF8zLjJfRFJfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF8zLjJfRFJfYmFycyA8LSBzZXRfMy4yX0RSX2JhcnMgKyBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gImJvdHRvbSIsIGV4cGFuZCA9IGMoMCwwKSkKc2V0XzMuMl9EUl9iYXJzIDwtIHNldF8zLjJfRFJfYmFycyArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCw3LjkpKQojc2V0XzMuMl9EUl9iYXJzIDwtIHNldF8zLjJfRFJfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzE4XSwgeT02LCBsYWJlbD0iMjExJSIpLCBoanVzdD0wLjM4KQojc2V0XzMuMl9EUl9iYXJzIDwtIHNldF8zLjJfRFJfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzIzXSwgeT03LjcsIGxhYmVsPSIyNTAlIiksIGhqdXN0PTAuMzgpCgpzZXRfMy4yX0RSX2JhcnMKYGBgCgojIyMgQ293cGxvdCAtIFNldCAzLjIgLSBGdWxsCmBgYHtyLCBmaWcud2lkdGg9MTB9CnNldF8zLjJfZHJ5X2dyaWQgPC0gcGxvdF9ncmlkKHNldF8zLjJfRFNfYmFycyArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzMuMl9EUl9iYXJzICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDIiwgIkQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX3NpemUgPSAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICd2aCcpCgpzZXRfMy4yX2Z1bGxfZ3JpZCA8LSBwbG90X2dyaWQoc2V0XzMuMl93ZXRfZ3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfMy4yX2RyeV9ncmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKQpzZXRfMy4yX2Z1bGxfZ3JpZAoKZ2dzYXZlKCIuL1Bsb3RzL3NldF8zLjJfZnVsbF9ncmlkLnBkZiIsIHNldF8zLjJfZnVsbF9ncmlkLCB3aWR0aCA9IDE2LCBoZWlnaHQgPSAxNikKCmBgYAoKIyMjIFNldCAzLjMKCiMjIyMgRHJ5IFNob290CgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCgpzdGF0X3MzLjNfRFNfY29tcGxldGUgPC0gc3RhdF9zZXRfMy4zX0RTW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzMuM19EUyksXQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBEcnkgU2hvb3QgbWcKCnNldF8zLjNfRFNfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MzLjNfRFNfY29tcGxldGVbMzcsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MzLjNfRFNfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczMuM19EU19jb21wbGV0ZVszNyw1XSkKCnN0YXRfczMuM19EU19jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMy4zX0RTX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF8zLjNfRFNfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMy4zX0RTX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzMuM19EU19iYXJzIDwtIHNldF8zLjNfRFNfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJsaWdodGdyZWVuIikKc2V0XzMuM19EU19iYXJzIDwtIHNldF8zLjNfRFNfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzMuM19EU19jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfMy4zX0RTX2JhcnMgPC0gc2V0XzMuM19EU19iYXJzICsgbGFicyh4PSIiLCB5PSJTaG9vdCAtIERyeSBXZWlnaHQgKG1nKSIpCnNldF8zLjNfRFNfYmFycyA8LSBzZXRfMy4zX0RTX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQpzZXRfMy4zX0RTX2JhcnMgPC0gc2V0XzMuM19EU19iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzMuM19EU19iYXJzIDwtIHNldF8zLjNfRFNfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMy4zX0RTX2JhcnMgPC0gc2V0XzMuM19EU19iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDQ5KSkKCnNldF8zLjNfRFNfYmFycwpgYGAKCiMjIyMgRHJ5IFJvb3QKCmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKc3RhdF9zMy4zX0RSX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzMuM19EUltjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF8zLjNfRFIpLF0KCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgRHJ5IFNob290IG1nCnNldF8zLjNfRFJfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MzLjNfRFJfY29tcGxldGVbMzcsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MzLjNfRFJfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczMuM19EUl9jb21wbGV0ZVszNyw1XSkKCnN0YXRfczMuM19EUl9jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMy4zX0RSX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF8zLjNfRFJfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMy4zX0RSX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzMuM19EUl9iYXJzIDwtIHNldF8zLjNfRFJfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJ0YW4iKQpzZXRfMy4zX0RSX2JhcnMgPC0gc2V0XzMuM19EUl9iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfMy4zX0RSX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF8zLjNfRFJfYmFycyA8LSBzZXRfMy4zX0RSX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlJvb3QgLSBEcnkgV2VpZ2h0IChtZykiKQpzZXRfMy4zX0RSX2JhcnMgPC0gc2V0XzMuM19EUl9iYXJzICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BdmVyYWdlLVNFLCB5bWF4PUF2ZXJhZ2UrU0UpLCBzaXplPS41LCB3aWR0aD0uMikKc2V0XzMuM19EUl9iYXJzIDwtIHNldF8zLjNfRFJfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF8zLjNfRFJfYmFycyA8LSBzZXRfMy4zX0RSX2JhcnMgKyBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gImJvdHRvbSIsIGV4cGFuZCA9IGMoMCwwKSkKc2V0XzMuM19EUl9iYXJzIDwtIHNldF8zLjNfRFJfYmFycyArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCw4LjkpKQoKc2V0XzMuM19EUl9iYXJzCmBgYAoKIyMjIENvd3Bsb3QgLSBTZXQgMy4zIC0gRnVsbApgYGB7ciwgZmlnLndpZHRoPTEwfQpzZXRfMy4zX2RyeV9ncmlkIDwtIHBsb3RfZ3JpZChzZXRfMy4zX0RTX2JhcnMgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF8zLjNfRFJfYmFycyArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQyIsICJEIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9zaXplID0gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAndmgnKQoKc2V0XzMuM19mdWxsX2dyaWQgPC0gcGxvdF9ncmlkKHNldF8zLjNfd2V0X2dyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzMuM19kcnlfZ3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikKc2V0XzMuM19mdWxsX2dyaWQKCmdnc2F2ZSgiLi9QbG90cy9zZXRfMy4zX2Z1bGxfZ3JpZC5wZGYiLCBzZXRfMy4zX2Z1bGxfZ3JpZCwgd2lkdGggPSAxNiwgaGVpZ2h0ID0gMTYpCgpgYGAKCiMjIyBTZXQgMy40CgojIyMjIERyeSBTaG9vdAoKYGBge3IsIGZpZy53aWR0aCA9IDEwfQojIGdncGxvdCB3aXRoIGJhcnMKCiMjIHJlbW92ZSBpc29hbHRlcyB3aXRoIE5BIHZhbHVlcwoKc3RhdF9zMy40X0RTX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzMuNF9EU1tjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF8zLjRfRFMpLF0KCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgRHJ5IFNob290IG1nCgpzZXRfMy40X0RTX2NvbnRyb2xfaW50IDwtIGFzLm51bWVyaWMoc3RhdF9zMy40X0RTX2NvbXBsZXRlWzM2LDVdKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zMy40X0RTX2NvbXBsZXRlJGNvbnRyb2wgPC0gYXMubnVtZXJpYyhzdGF0X3MzLjRfRFNfY29tcGxldGVbMzYsNV0pCgpzdGF0X3MzLjRfRFNfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczMuNF9EU19jb21wbGV0ZSwgcF9jdHJsID0gKDEwMCogKEF2ZXJhZ2UgLyBjb250cm9sKSkpCgpzZXRfMy40X0RTX2JhcnMgPC0gZ2dwbG90KHN0YXRfczMuNF9EU19jb21wbGV0ZSwgYWVzKHggPSBpc29sYXRlLCB5ID0gQXZlcmFnZSkpCnNldF8zLjRfRFNfYmFycyA8LSBzZXRfMy40X0RTX2JhcnMgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgc2l6ZT0uNSwgZmlsbD0ibGlnaHRncmVlbiIpCnNldF8zLjRfRFNfYmFycyA8LSBzZXRfMy40X0RTX2JhcnMgKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PXNldF8zLjRfRFNfY29udHJvbF9pbnQpLCBjb2xvdXI9IiM5OTAwMDAiLCBsaW5ldHlwZT0iZGFzaGVkIikKc2V0XzMuNF9EU19iYXJzIDwtIHNldF8zLjRfRFNfYmFycyArIGxhYnMoeD0iIiwgeT0iU2hvb3QgLSBEcnkgV2VpZ2h0IChtZykiKQpzZXRfMy40X0RTX2JhcnMgPC0gc2V0XzMuNF9EU19iYXJzICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BdmVyYWdlLVNFLCB5bWF4PUF2ZXJhZ2UrU0UpLCBzaXplPS41LCB3aWR0aD0uMikKc2V0XzMuNF9EU19iYXJzIDwtIHNldF8zLjRfRFNfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF8zLjRfRFNfYmFycyA8LSBzZXRfMy40X0RTX2JhcnMgKyBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gImJvdHRvbSIsIGV4cGFuZCA9IGMoMCwwKSkKc2V0XzMuNF9EU19iYXJzIDwtIHNldF8zLjRfRFNfYmFycyArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCwzNSkpCgpzZXRfMy40X0RTX2JhcnMgPC0gc2V0XzMuNF9EU19iYXJzICsgZ2VvbV90ZXh0KGFlcyh4PWlzb2xhdGVbMTddLCB5PTMxLjUsIGxhYmVsPSIxNTAlIiksIGhqdXN0PTAuMzgpCgpzZXRfMy40X0RTX2JhcnMKYGBgCgojIyMjIERyeSBSb290CgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCnN0YXRfczMuNF9EUl9jb21wbGV0ZSA8LSBzdGF0X3NldF8zLjRfRFJbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfMy40X0RSKSxdCgojIyBzZXQgdGhlIGNvbnRyb2wgdmFsdWUgZm9yIERyeSBTaG9vdCBtZwpzZXRfMy40X0RSX2NvbnRyb2xfaW50IDwtIGFzLm51bWVyaWMoc3RhdF9zMy40X0RSX2NvbXBsZXRlWzM2LDVdKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zMy40X0RSX2NvbXBsZXRlJGNvbnRyb2wgPC0gYXMubnVtZXJpYyhzdGF0X3MzLjRfRFJfY29tcGxldGVbMzYsNV0pCgpzdGF0X3MzLjRfRFJfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczMuNF9EUl9jb21wbGV0ZSwgcF9jdHJsID0gKDEwMCogKEF2ZXJhZ2UgLyBjb250cm9sKSkpCgpzZXRfMy40X0RSX2JhcnMgPC0gZ2dwbG90KHN0YXRfczMuNF9EUl9jb21wbGV0ZSwgYWVzKHggPSBpc29sYXRlLCB5ID0gQXZlcmFnZSkpCnNldF8zLjRfRFJfYmFycyA8LSBzZXRfMy40X0RSX2JhcnMgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgc2l6ZT0uNSwgZmlsbD0idGFuIikKc2V0XzMuNF9EUl9iYXJzIDwtIHNldF8zLjRfRFJfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzMuNF9EUl9jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfMy40X0RSX2JhcnMgPC0gc2V0XzMuNF9EUl9iYXJzICsgbGFicyh4PSIiLCB5PSJSb290IC0gRHJ5IFdlaWdodCAobWcpIikKc2V0XzMuNF9EUl9iYXJzIDwtIHNldF8zLjRfRFJfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF8zLjRfRFJfYmFycyA8LSBzZXRfMy40X0RSX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfMy40X0RSX2JhcnMgPC0gc2V0XzMuNF9EUl9iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF8zLjRfRFJfYmFycyA8LSBzZXRfMy40X0RSX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsOC45KSkKCnNldF8zLjRfRFJfYmFycyA8LSBzZXRfMy40X0RSX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVs2XSwgeT02LjMsIGxhYmVsPSIxMzQlIiksIGhqdXN0PTAuMzgpCgpzZXRfMy40X0RSX2JhcnMKYGBgCgojIyMgQ293cGxvdCAtIFNldCAzLjQgLSBGdWxsCmBgYHtyLCBmaWcud2lkdGg9MTB9CnNldF8zLjRfZHJ5X2dyaWQgPC0gcGxvdF9ncmlkKHNldF8zLjRfRFNfYmFycyArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzMuNF9EUl9iYXJzICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDIiwgIkQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX3NpemUgPSAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICd2aCcpCgpzZXRfMy40X2Z1bGxfZ3JpZCA8LSBwbG90X2dyaWQoc2V0XzMuNF93ZXRfZ3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfMy40X2RyeV9ncmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKQpzZXRfMy40X2Z1bGxfZ3JpZAoKZ2dzYXZlKCIuL1Bsb3RzL3NldF8zLjRfZnVsbF9ncmlkLnBkZiIsIHNldF8zLjRfZnVsbF9ncmlkLCB3aWR0aCA9IDE2LCBoZWlnaHQgPSAxNikKCmBgYAoKIyMjIFNldCAzLjUKCiMjIyMgRHJ5IFNob290CgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCgpzdGF0X3MzLjVfRFNfY29tcGxldGUgPC0gc3RhdF9zZXRfMy41X0RTW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzMuNV9EUyksXQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBEcnkgU2hvb3QgbWcKCnNldF8zLjVfRFNfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3MzLjVfRFNfY29tcGxldGVbMjAsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3MzLjVfRFNfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczMuNV9EU19jb21wbGV0ZVsyMCw1XSkKCnN0YXRfczMuNV9EU19jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zMy41X0RTX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF8zLjVfRFNfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zMy41X0RTX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzMuNV9EU19iYXJzIDwtIHNldF8zLjVfRFNfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJsaWdodGdyZWVuIikKc2V0XzMuNV9EU19iYXJzIDwtIHNldF8zLjVfRFNfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzMuNV9EU19jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfMy41X0RTX2JhcnMgPC0gc2V0XzMuNV9EU19iYXJzICsgbGFicyh4PSIiLCB5PSJTaG9vdCAtIERyeSBXZWlnaHQgKG1nKSIpCnNldF8zLjVfRFNfYmFycyA8LSBzZXRfMy41X0RTX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQpzZXRfMy41X0RTX2JhcnMgPC0gc2V0XzMuNV9EU19iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzMuNV9EU19iYXJzIDwtIHNldF8zLjVfRFNfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfMy41X0RTX2JhcnMgPC0gc2V0XzMuNV9EU19iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDI5KSkKCnNldF8zLjVfRFNfYmFycyA8LSBzZXRfMy41X0RTX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVsxMV0sIHk9MjcsIGxhYmVsPSIxNTAlIiksIGhqdXN0PTAuMzgpCgpzZXRfMy41X0RTX2JhcnMKYGBgCgojIyMjIERyeSBSb290CgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCnN0YXRfczMuNV9EUl9jb21wbGV0ZSA8LSBzdGF0X3NldF8zLjVfRFJbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfMy41X0RSKSxdCgojIyBzZXQgdGhlIGNvbnRyb2wgdmFsdWUgZm9yIERyeSBTaG9vdCBtZwpzZXRfMy41X0RSX2NvbnRyb2xfaW50IDwtIGFzLm51bWVyaWMoc3RhdF9zMy41X0RSX2NvbXBsZXRlWzIwLDVdKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zMy41X0RSX2NvbXBsZXRlJGNvbnRyb2wgPC0gYXMubnVtZXJpYyhzdGF0X3MzLjVfRFJfY29tcGxldGVbMjAsNV0pCgpzdGF0X3MzLjVfRFJfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczMuNV9EUl9jb21wbGV0ZSwgcF9jdHJsID0gKDEwMCogKEF2ZXJhZ2UgLyBjb250cm9sKSkpCgpzZXRfMy41X0RSX2JhcnMgPC0gZ2dwbG90KHN0YXRfczMuNV9EUl9jb21wbGV0ZSwgYWVzKHggPSBpc29sYXRlLCB5ID0gQXZlcmFnZSkpCnNldF8zLjVfRFJfYmFycyA8LSBzZXRfMy41X0RSX2JhcnMgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgc2l6ZT0uNSwgZmlsbD0idGFuIikKc2V0XzMuNV9EUl9iYXJzIDwtIHNldF8zLjVfRFJfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzMuNV9EUl9jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfMy41X0RSX2JhcnMgPC0gc2V0XzMuNV9EUl9iYXJzICsgbGFicyh4PSIiLCB5PSJSb290IC0gRHJ5IFdlaWdodCAobWcpIikKc2V0XzMuNV9EUl9iYXJzIDwtIHNldF8zLjVfRFJfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF8zLjVfRFJfYmFycyA8LSBzZXRfMy41X0RSX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfMy41X0RSX2JhcnMgPC0gc2V0XzMuNV9EUl9iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF8zLjVfRFJfYmFycyA8LSBzZXRfMy41X0RSX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNS43KSkKCnNldF8zLjVfRFJfYmFycwpgYGAKCiMjIyBDb3dwbG90IC0gU2V0IDMuNSAtIEZ1bGwKYGBge3IsIGZpZy53aWR0aD0xMH0Kc2V0XzMuNV9kcnlfZ3JpZCA8LSBwbG90X2dyaWQoc2V0XzMuNV9EU19iYXJzICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfMy41X0RSX2JhcnMgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkMiLCAiRCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfc2l6ZSA9IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gJ3ZoJykKCnNldF8zLjVfZnVsbF9ncmlkIDwtIHBsb3RfZ3JpZChzZXRfMy41X3dldF9ncmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF8zLjVfZHJ5X2dyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpCnNldF8zLjVfZnVsbF9ncmlkCgpnZ3NhdmUoIi4vUGxvdHMvc2V0XzMuNV9mdWxsX2dyaWQucGRmIiwgc2V0XzMuNV9mdWxsX2dyaWQsIHdpZHRoID0gMTYsIGhlaWdodCA9IDE2KQoKYGBgCgojIyMgU2V0IDQuMQoKIyMjIyBEcnkgU2hvb3QKCmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKCnN0YXRfczQuMV9EU19jb21wbGV0ZSA8LSBzdGF0X3NldF80LjFfRFNbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfNC4xX0RTKSxdCgojIyBzZXQgdGhlIGNvbnRyb2wgdmFsdWUgZm9yIERyeSBTaG9vdCBtZwoKc2V0XzQuMV9EU19jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfczQuMV9EU19jb21wbGV0ZVszNyw1XSkKCiMjIGNhbGN1bGF0ZSAlIGNvbnRyb2wgZm9yIGVhY2ggdHJlYXRtZW50CnN0YXRfczQuMV9EU19jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zNC4xX0RTX2NvbXBsZXRlWzM3LDVdKQoKc3RhdF9zNC4xX0RTX2NvbXBsZXRlIDwtIG11dGF0ZShzdGF0X3M0LjFfRFNfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKc2V0XzQuMV9EU19iYXJzIDwtIGdncGxvdChzdGF0X3M0LjFfRFNfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfNC4xX0RTX2JhcnMgPC0gc2V0XzQuMV9EU19iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9ImxpZ2h0Z3JlZW4iKQpzZXRfNC4xX0RTX2JhcnMgPC0gc2V0XzQuMV9EU19iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfNC4xX0RTX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF80LjFfRFNfYmFycyA8LSBzZXRfNC4xX0RTX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlNob290IC0gRHJ5IFdlaWdodCAobWcpIikKc2V0XzQuMV9EU19iYXJzIDwtIHNldF80LjFfRFNfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF80LjFfRFNfYmFycyA8LSBzZXRfNC4xX0RTX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfNC4xX0RTX2JhcnMgPC0gc2V0XzQuMV9EU19iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF80LjFfRFNfYmFycyA8LSBzZXRfNC4xX0RTX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNDUpKQoKc2V0XzQuMV9EU19iYXJzIDwtIHNldF80LjFfRFNfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzE2XSwgeT0zNywgbGFiZWw9IjE2NSUiKSwgaGp1c3Q9MC4zOCkKCnNldF80LjFfRFNfYmFycyA8LSBzZXRfNC4xX0RTX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVsyNV0sIHk9NDIsIGxhYmVsPSIxODAlIiksIGhqdXN0PTAuMzgpCgpzZXRfNC4xX0RTX2JhcnMKYGBgCgojIyMjIERyeSBSb290CgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCnN0YXRfczQuMV9EUl9jb21wbGV0ZSA8LSBzdGF0X3NldF80LjFfRFJbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfNC4xX0RSKSxdCgojIyBzZXQgdGhlIGNvbnRyb2wgdmFsdWUgZm9yIERyeSBTaG9vdCBtZwpzZXRfNC4xX0RSX2NvbnRyb2xfaW50IDwtIGFzLm51bWVyaWMoc3RhdF9zNC4xX0RSX2NvbXBsZXRlWzM3LDVdKQoKIyMgY2FsY3VsYXRlICUgY29udHJvbCBmb3IgZWFjaCB0cmVhdG1lbnQKc3RhdF9zNC4xX0RSX2NvbXBsZXRlJGNvbnRyb2wgPC0gYXMubnVtZXJpYyhzdGF0X3M0LjFfRFJfY29tcGxldGVbMzcsNV0pCgpzdGF0X3M0LjFfRFJfY29tcGxldGUgPC0gbXV0YXRlKHN0YXRfczQuMV9EUl9jb21wbGV0ZSwgcF9jdHJsID0gKDEwMCogKEF2ZXJhZ2UgLyBjb250cm9sKSkpCgpzZXRfNC4xX0RSX2JhcnMgPC0gZ2dwbG90KHN0YXRfczQuMV9EUl9jb21wbGV0ZSwgYWVzKHggPSBpc29sYXRlLCB5ID0gQXZlcmFnZSkpCnNldF80LjFfRFJfYmFycyA8LSBzZXRfNC4xX0RSX2JhcnMgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgc2l6ZT0uNSwgZmlsbD0idGFuIikKc2V0XzQuMV9EUl9iYXJzIDwtIHNldF80LjFfRFJfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzQuMV9EUl9jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfNC4xX0RSX2JhcnMgPC0gc2V0XzQuMV9EUl9iYXJzICsgbGFicyh4PSIiLCB5PSJSb290IC0gRHJ5IFdlaWdodCAobWcpIikKc2V0XzQuMV9EUl9iYXJzIDwtIHNldF80LjFfRFJfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF80LjFfRFJfYmFycyA8LSBzZXRfNC4xX0RSX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfNC4xX0RSX2JhcnMgPC0gc2V0XzQuMV9EUl9iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF80LjFfRFJfYmFycyA8LSBzZXRfNC4xX0RSX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNS43KSkKCnNldF80LjFfRFJfYmFycwpgYGAKCiMjIyBDb3dwbG90IC0gU2V0IDQuMSAtIEZ1bGwKYGBge3IsIGZpZy53aWR0aD0xMH0Kc2V0XzQuMV9kcnlfZ3JpZCA8LSBwbG90X2dyaWQoc2V0XzQuMV9EU19iYXJzICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfNC4xX0RSX2JhcnMgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkMiLCAiRCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfc2l6ZSA9IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gJ3ZoJykKCnNldF80LjFfZnVsbF9ncmlkIDwtIHBsb3RfZ3JpZChzZXRfNC4xX3dldF9ncmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF80LjFfZHJ5X2dyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpCnNldF80LjFfZnVsbF9ncmlkCgpnZ3NhdmUoIi4vUGxvdHMvc2V0XzQuMV9mdWxsX2dyaWQucGRmIiwgc2V0XzQuMV9mdWxsX2dyaWQsIHdpZHRoID0gMTYsIGhlaWdodCA9IDE2KQoKYGBgCgojIyMgU2V0IDQuMgoKIyMjIyBEcnkgU2hvb3QKCmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKCnN0YXRfczQuMl9EU19jb21wbGV0ZSA8LSBzdGF0X3NldF80LjJfRFNbY29tcGxldGUuY2FzZXMoc3RhdF9zZXRfNC4yX0RTKSxdCgojIyBzZXQgdGhlIGNvbnRyb2wgdmFsdWUgZm9yIERyeSBTaG9vdCBtZwoKc2V0XzQuMl9EU19jb250cm9sX2ludCA8LSBhcy5udW1lcmljKHN0YXRfczQuMl9EU19jb21wbGV0ZVsyMyw1XSkKCiMjIGNhbGN1bGF0ZSAlIGNvbnRyb2wgZm9yIGVhY2ggdHJlYXRtZW50CnN0YXRfczQuMl9EU19jb21wbGV0ZSRjb250cm9sIDwtIGFzLm51bWVyaWMoc3RhdF9zNC4yX0RTX2NvbXBsZXRlWzIzLDVdKQoKc3RhdF9zNC4yX0RTX2NvbXBsZXRlIDwtIG11dGF0ZShzdGF0X3M0LjJfRFNfY29tcGxldGUsIHBfY3RybCA9ICgxMDAqIChBdmVyYWdlIC8gY29udHJvbCkpKQoKc2V0XzQuMl9EU19iYXJzIDwtIGdncGxvdChzdGF0X3M0LjJfRFNfY29tcGxldGUsIGFlcyh4ID0gaXNvbGF0ZSwgeSA9IEF2ZXJhZ2UpKQpzZXRfNC4yX0RTX2JhcnMgPC0gc2V0XzQuMl9EU19iYXJzICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNpemU9LjUsIGZpbGw9ImxpZ2h0Z3JlZW4iKQpzZXRfNC4yX0RTX2JhcnMgPC0gc2V0XzQuMl9EU19iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfNC4yX0RTX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF80LjJfRFNfYmFycyA8LSBzZXRfNC4yX0RTX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlNob290IC0gRHJ5IFdlaWdodCAobWcpIikKc2V0XzQuMl9EU19iYXJzIDwtIHNldF80LjJfRFNfYmFycyArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QXZlcmFnZS1TRSwgeW1heD1BdmVyYWdlK1NFKSwgc2l6ZT0uNSwgd2lkdGg9LjIpCnNldF80LjJfRFNfYmFycyA8LSBzZXRfNC4yX0RTX2JhcnMgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpzZXRfNC4yX0RTX2JhcnMgPC0gc2V0XzQuMl9EU19iYXJzICsgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJib3R0b20iLCBleHBhbmQgPSBjKDAsMCkpCnNldF80LjJfRFNfYmFycyA8LSBzZXRfNC4yX0RTX2JhcnMgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNTIpKQoKc2V0XzQuMl9EU19iYXJzIDwtIHNldF80LjJfRFNfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzhdLCB5PTQyLCBsYWJlbD0iMjQyJSIpLCBoanVzdD0wLjM4KQoKc2V0XzQuMl9EU19iYXJzIDwtIHNldF80LjJfRFNfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzE3XSwgeT0zOCwgbGFiZWw9IjIwMyUiKSwgaGp1c3Q9MC4zOCkKCnNldF80LjJfRFNfYmFycwpgYGAKCiMjIyMgRHJ5IFJvb3QKCmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKc3RhdF9zNC4yX0RSX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzQuMl9EUltjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF80LjJfRFIpLF0KCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgRHJ5IFNob290IG1nCnNldF80LjJfRFJfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3M0LjJfRFJfY29tcGxldGVbMjMsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3M0LjJfRFJfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczQuMl9EUl9jb21wbGV0ZVsyMyw1XSkKCnN0YXRfczQuMl9EUl9jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zNC4yX0RSX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF80LjJfRFJfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zNC4yX0RSX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzQuMl9EUl9iYXJzIDwtIHNldF80LjJfRFJfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJ0YW4iKQpzZXRfNC4yX0RSX2JhcnMgPC0gc2V0XzQuMl9EUl9iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfNC4yX0RSX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF80LjJfRFJfYmFycyA8LSBzZXRfNC4yX0RSX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlJvb3QgLSBEcnkgV2VpZ2h0IChtZykiKQpzZXRfNC4yX0RSX2JhcnMgPC0gc2V0XzQuMl9EUl9iYXJzICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BdmVyYWdlLVNFLCB5bWF4PUF2ZXJhZ2UrU0UpLCBzaXplPS41LCB3aWR0aD0uMikKc2V0XzQuMl9EUl9iYXJzIDwtIHNldF80LjJfRFJfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF80LjJfRFJfYmFycyA8LSBzZXRfNC4yX0RSX2JhcnMgKyBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gImJvdHRvbSIsIGV4cGFuZCA9IGMoMCwwKSkKc2V0XzQuMl9EUl9iYXJzIDwtIHNldF80LjJfRFJfYmFycyArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCw1LjcpKQoKc2V0XzQuMl9EUl9iYXJzIDwtIHNldF80LjJfRFJfYmFycyArIGdlb21fdGV4dChhZXMoeD1pc29sYXRlWzZdLCB5PTQuNSwgbGFiZWw9IjM5MiUiKSwgaGp1c3Q9MC4zOCkKCnNldF80LjJfRFJfYmFycyA8LSBzZXRfNC4yX0RSX2JhcnMgKyBnZW9tX3RleHQoYWVzKHg9aXNvbGF0ZVs4XSwgeT00LjcsIGxhYmVsPSI0MjAlIiksIGhqdXN0PTAuMzgpCgpzZXRfNC4yX0RSX2JhcnMKYGBgCgojIyMgQ293cGxvdCAtIFNldCA0LjIgLSBGdWxsCmBgYHtyLCBmaWcud2lkdGg9MTB9CnNldF80LjJfZHJ5X2dyaWQgPC0gcGxvdF9ncmlkKHNldF80LjJfRFNfYmFycyArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzQuMl9EUl9iYXJzICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoLjEsLjEsLjEsLjEpLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDIiwgIkQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX3NpemUgPSAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICd2aCcpCgpzZXRfNC4yX2Z1bGxfZ3JpZCA8LSBwbG90X2dyaWQoc2V0XzQuMl93ZXRfZ3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfNC4yX2RyeV9ncmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKQpzZXRfNC4yX2Z1bGxfZ3JpZAoKZ2dzYXZlKCIuL1Bsb3RzL3NldF80LjJfZnVsbF9ncmlkLnBkZiIsIHNldF80LjJfZnVsbF9ncmlkLCB3aWR0aCA9IDE2LCBoZWlnaHQgPSAxNikKCmBgYAoKIyMjIFNldCA0LjMKCiMjIyMgRHJ5IFNob290CgpgYGB7ciwgZmlnLndpZHRoID0gMTB9CiMgZ2dwbG90IHdpdGggYmFycwoKIyMgcmVtb3ZlIGlzb2FsdGVzIHdpdGggTkEgdmFsdWVzCgpzdGF0X3M0LjNfRFNfY29tcGxldGUgPC0gc3RhdF9zZXRfNC4zX0RTW2NvbXBsZXRlLmNhc2VzKHN0YXRfc2V0XzQuM19EUyksXQoKIyMgc2V0IHRoZSBjb250cm9sIHZhbHVlIGZvciBEcnkgU2hvb3QgbWcKCnNldF80LjNfRFNfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3M0LjNfRFNfY29tcGxldGVbMjUsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3M0LjNfRFNfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczQuM19EU19jb21wbGV0ZVsyNSw1XSkKCnN0YXRfczQuM19EU19jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zNC4zX0RTX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF80LjNfRFNfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zNC4zX0RTX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzQuM19EU19iYXJzIDwtIHNldF80LjNfRFNfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJsaWdodGdyZWVuIikKc2V0XzQuM19EU19iYXJzIDwtIHNldF80LjNfRFNfYmFycyArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9c2V0XzQuM19EU19jb250cm9sX2ludCksIGNvbG91cj0iIzk5MDAwMCIsIGxpbmV0eXBlPSJkYXNoZWQiKQpzZXRfNC4zX0RTX2JhcnMgPC0gc2V0XzQuM19EU19iYXJzICsgbGFicyh4PSIiLCB5PSJTaG9vdCAtIERyeSBXZWlnaHQgKG1nKSIpCnNldF80LjNfRFNfYmFycyA8LSBzZXRfNC4zX0RTX2JhcnMgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUF2ZXJhZ2UtU0UsIHltYXg9QXZlcmFnZStTRSksIHNpemU9LjUsIHdpZHRoPS4yKQpzZXRfNC4zX0RTX2JhcnMgPC0gc2V0XzQuM19EU19iYXJzICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCBzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKc2V0XzQuM19EU19iYXJzIDwtIHNldF80LjNfRFNfYmFycyArIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAiYm90dG9tIiwgZXhwYW5kID0gYygwLDApKQpzZXRfNC4zX0RTX2JhcnMgPC0gc2V0XzQuM19EU19iYXJzICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDM1KSkKCnNldF80LjNfRFNfYmFycwpgYGAKCiMjIyMgRHJ5IFJvb3QKCmBgYHtyLCBmaWcud2lkdGggPSAxMH0KIyBnZ3Bsb3Qgd2l0aCBiYXJzCgojIyByZW1vdmUgaXNvYWx0ZXMgd2l0aCBOQSB2YWx1ZXMKc3RhdF9zNC4zX0RSX2NvbXBsZXRlIDwtIHN0YXRfc2V0XzQuM19EUltjb21wbGV0ZS5jYXNlcyhzdGF0X3NldF80LjNfRFIpLF0KCiMjIHNldCB0aGUgY29udHJvbCB2YWx1ZSBmb3IgRHJ5IFNob290IG1nCnNldF80LjNfRFJfY29udHJvbF9pbnQgPC0gYXMubnVtZXJpYyhzdGF0X3M0LjNfRFJfY29tcGxldGVbMjUsNV0pCgojIyBjYWxjdWxhdGUgJSBjb250cm9sIGZvciBlYWNoIHRyZWF0bWVudApzdGF0X3M0LjNfRFJfY29tcGxldGUkY29udHJvbCA8LSBhcy5udW1lcmljKHN0YXRfczQuM19EUl9jb21wbGV0ZVsyNSw1XSkKCnN0YXRfczQuM19EUl9jb21wbGV0ZSA8LSBtdXRhdGUoc3RhdF9zNC4zX0RSX2NvbXBsZXRlLCBwX2N0cmwgPSAoMTAwKiAoQXZlcmFnZSAvIGNvbnRyb2wpKSkKCnNldF80LjNfRFJfYmFycyA8LSBnZ3Bsb3Qoc3RhdF9zNC4zX0RSX2NvbXBsZXRlLCBhZXMoeCA9IGlzb2xhdGUsIHkgPSBBdmVyYWdlKSkKc2V0XzQuM19EUl9iYXJzIDwtIHNldF80LjNfRFJfYmFycyArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBzaXplPS41LCBmaWxsPSJ0YW4iKQpzZXRfNC4zX0RSX2JhcnMgPC0gc2V0XzQuM19EUl9iYXJzICsgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD1zZXRfNC4zX0RSX2NvbnRyb2xfaW50KSwgY29sb3VyPSIjOTkwMDAwIiwgbGluZXR5cGU9ImRhc2hlZCIpCnNldF80LjNfRFJfYmFycyA8LSBzZXRfNC4zX0RSX2JhcnMgKyBsYWJzKHg9IiIsIHk9IlJvb3QgLSBEcnkgV2VpZ2h0IChtZykiKQpzZXRfNC4zX0RSX2JhcnMgPC0gc2V0XzQuM19EUl9iYXJzICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BdmVyYWdlLVNFLCB5bWF4PUF2ZXJhZ2UrU0UpLCBzaXplPS41LCB3aWR0aD0uMikKc2V0XzQuM19EUl9iYXJzIDwtIHNldF80LjNfRFJfYmFycyArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCnNldF80LjNfRFJfYmFycyA8LSBzZXRfNC4zX0RSX2JhcnMgKyBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gImJvdHRvbSIsIGV4cGFuZCA9IGMoMCwwKSkKc2V0XzQuM19EUl9iYXJzIDwtIHNldF80LjNfRFJfYmFycyArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCwzLjkpKQoKc2V0XzQuM19EUl9iYXJzCmBgYAoKIyMjIENvd3Bsb3QgLSBTZXQgNC4zIC0gRnVsbApgYGB7ciwgZmlnLndpZHRoPTEwfQpzZXRfNC4zX2RyeV9ncmlkIDwtIHBsb3RfZ3JpZChzZXRfNC4zX0RTX2JhcnMgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguMSwuMSwuMSwuMSksICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF80LjNfRFJfYmFycyArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC4xLC4xLC4xLC4xKSwgImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQyIsICJEIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9zaXplID0gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAndmgnKQoKc2V0XzQuM19mdWxsX2dyaWQgPC0gcGxvdF9ncmlkKHNldF80LjNfd2V0X2dyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0XzQuM19kcnlfZ3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikKc2V0XzQuM19mdWxsX2dyaWQKCmdnc2F2ZSgiLi9QbG90cy9zZXRfNC4zX2Z1bGxfZ3JpZC5wZGYiLCBzZXRfNC4zX2Z1bGxfZ3JpZCwgd2lkdGggPSAxNiwgaGVpZ2h0ID0gMTYpCgpgYGAKCiMjIFRhYmxlIDIKCj4gU3RhdGlzdGljYWxseSBTaWduaWZpY2FudCBJc29sYXRlcyBiYXNlZCBvbiBXZXQgV2VpZ2h0IE1lYXNydWVtZW50cwoKIyMjIENyZWF0ZSBNYXN0ZXIgRGF0YWZyYW1lIG9mIFBsb3QgV2VpZ2h0cwpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBDcmVhdGUgbGlzdHMgb2YgZGZzIGZvciB3ZXQgc2hvb3QgY29tcGxldGUgY2FzZXMKd2V0X3Nob290X3N0YXRfbGlzdCA8LSBtZ2V0KGxzKHBhdHRlcm4gPSAic3RhdF8uK19XU19jb21wbGV0ZSIpKQp3ZXRfcm9vdF9zdGF0X2xpc3QgPC0gbWdldChscyhwYXR0ZXJuID0gInN0YXRfLitfV1JfY29tcGxldGUiKSkKZHJ5X3Nob290X3N0YXRfbGlzdCA8LSBtZ2V0KGxzKHBhdHRlcm4gPSAic3RhdF8uK19EU19jb21wbGV0ZSIpKQpkcnlfcm9vdF9zdGF0X2xpc3QgPC0gbWdldChscyhwYXR0ZXJuID0gInN0YXRfLitfRFJfY29tcGxldGUiKSkKCiMjIEJpbmQgcm93cwp3ZXRfc2hvb3RfbWFzdGVyIDwtIGJpbmRfcm93cyh3ZXRfc2hvb3Rfc3RhdF9saXN0KQp3ZXRfcm9vdF9tYXN0ZXIgPC0gYmluZF9yb3dzKHdldF9yb290X3N0YXRfbGlzdCkKZHJ5X3Nob290X21hc3RlciA8LSBiaW5kX3Jvd3MoZHJ5X3Nob290X3N0YXRfbGlzdCkKZHJ5X3Jvb3RfbWFzdGVyIDwtIGJpbmRfcm93cyhkcnlfcm9vdF9zdGF0X2xpc3QpCgpgYGAKCj4gY3JlYXRlIG1hc3RlciBkYXRhZnJhbWUgb2YgbHNtZWFuc19kYXRhIGZvciBlYWNoIHNhbXBsZSB0eXBlCgo+IHRydC52cy5jb250cm9sCgo+IHAtdmFsdWUgY29ycmVjdGlvbiBmb3IgbXVsdGlwbGUgdGVzdGluZyB1c2luZyBEdW5uZXR0WCBtZXRob2QKCj4gY29uZmlkZW5jZSBsZXZlbCB1c2VkID0gMC45NSBvciBhbHBoYSA9IDAuMDUKCiMjIyBSZWFkIGluIGNzdiBmaWxlcwoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgTWFrZSBsaXN0cyBvZiBmaWxlcyBmb3IgZGF0YWZyYW1lcwoKIyMgRHJ5IFJvb3QgZmlsZXMKcGF0aHMubHNtLmR1bi5EUiA8LSBsaXN0LmZpbGVzKHBhdGggPSAiLi9sc21lYW5zX3N1bW1hcnlfdGFibGVzLyIsIHBhdHRlcm4gPSAiKi5EUi5jc3YiLCByZWN1cnNpdmUgPSBULCBmdWxsLm5hbWVzID0gVCkKCiMjIERyeSBTaG9vdCBmaWxlcwpwYXRocy5sc20uZHVuLkRTIDwtIGxpc3QuZmlsZXMocGF0aCA9ICIuL2xzbWVhbnNfc3VtbWFyeV90YWJsZXMvIiwgcGF0dGVybiA9ICIqLkRTLmNzdiIsIHJlY3Vyc2l2ZSA9IFQsIGZ1bGwubmFtZXMgPSBUKQoKIyMgV2V0IFJvb3QgZmlsZXMKcGF0aHMubHNtLmR1bi5XUiA8LSBsaXN0LmZpbGVzKHBhdGggPSAiLi9sc21lYW5zX3N1bW1hcnlfdGFibGVzLyIsIHBhdHRlcm4gPSAiKi5XUi5jc3YiLCByZWN1cnNpdmUgPSBULCBmdWxsLm5hbWVzID0gVCkKCiMjIFdldCBTaG9vdCBmaWxlcwpwYXRocy5sc20uZHVuLldTIDwtIGxpc3QuZmlsZXMocGF0aCA9ICIuL2xzbWVhbnNfc3VtbWFyeV90YWJsZXMvIiwgcGF0dGVybiA9ICIqLldTLmNzdiIsIHJlY3Vyc2l2ZSA9IFQsIGZ1bGwubmFtZXMgPSBUKQoKIyBSZWFkIGluIGxpc3RzIG9mIERSIGZpbGVzCmxpc3QubHNtLmR1bi5EUiA8LSBsYXBwbHkocGF0aHMubHNtLmR1bi5EUiwgcmVhZF9jc3YpCgojIFJlYWQgaW4gbGlzdHMgb2YgRFMgZmlsZXMKbGlzdC5sc20uZHVuLkRTIDwtIGxhcHBseShwYXRocy5sc20uZHVuLkRTLCByZWFkX2NzdikKCiMgUmVhZCBpbiBsaXN0cyBvZiBXUiBmaWxlcwpsaXN0LmxzbS5kdW4uV1IgPC0gbGFwcGx5KHBhdGhzLmxzbS5kdW4uV1IsIHJlYWRfY3N2KQoKIyBSZWFkIGluIGxpc3RzIG9mIFdTIGZpbGVzCmxpc3QubHNtLmR1bi5XUyA8LSBsYXBwbHkocGF0aHMubHNtLmR1bi5XUywgcmVhZF9jc3YpCmBgYAoKIyMjIEJpbmQgUm93cwoKPiBNYWtlIGEgbWFzdGVyIGRhdGFmcmFtZQoKYGBge3J9CiMgRHJ5IFJvb3RzCmxzbS5kdW4uRFIubWFzdGVyIDwtIGJpbmRfcm93cyhsaXN0LmxzbS5kdW4uRFIpCgojIERyeSBTaG9vdHMKbHNtLmR1bi5EUy5tYXN0ZXIgPC0gYmluZF9yb3dzKGxpc3QubHNtLmR1bi5EUykKCiMgV2V0IFJvb3RzCmxzbS5kdW4uV1IubWFzdGVyIDwtIGJpbmRfcm93cyhsaXN0LmxzbS5kdW4uV1IpCgojIFdldCBTaG9vdHMKbHNtLmR1bi5XUy5tYXN0ZXIgPC0gYmluZF9yb3dzKGxpc3QubHNtLmR1bi5XUykKYGBgCgojIEFkZCBJc29sYXRlIG5hbWVzIGFuZCByZXNwb25zZSB0eXBlCmBgYHtyfQojIERyeSBSb290cwojIyBFeHRyYWN0IElzb2xhdGUgSUQgZnJvbSBjb250cmFzdCB2YXJpYWJsZQpsc20uZHVuLkRSLm1hc3RlciA8LSBsc20uZHVuLkRSLm1hc3RlciAlPiUgCiAgZXh0cmFjdChjb250cmFzdCwgaW50byA9ICJJc29sYXRlIiwgcmVnZXggPSAiKF5bMC05XSspIiwgcmVtb3ZlID0gRkFMU0UpCgojIyBDcmVhdGUgQkNXLUlEIHZhcmlhYmxlCmxzbS5kdW4uRFIubWFzdGVyIDwtIGxzbS5kdW4uRFIubWFzdGVyICU+JSAKICBtdXRhdGUoIkJDVy1JRCIgPSBwYXN0ZTAoIkJDVy0iLCBJc29sYXRlKSkgJT4lCiAgbXV0YXRlKCJSZXNwb25zZSIgPSAiRHJ5IFJvb3QiKQoKIyBEcnkgU2hvb3RzCiMjIEV4dHJhY3QgSXNvbGF0ZSBJRCBmcm9tIGNvbnRyYXN0IHZhcmlhYmxlCmxzbS5kdW4uRFMubWFzdGVyIDwtIGxzbS5kdW4uRFMubWFzdGVyICU+JSAKICBleHRyYWN0KGNvbnRyYXN0LCBpbnRvID0gIklzb2xhdGUiLCByZWdleCA9ICIoXlswLTldKykiLCByZW1vdmUgPSBGQUxTRSkKCiMjIENyZWF0ZSBCQ1ctSUQgdmFyaWFibGUKbHNtLmR1bi5EUy5tYXN0ZXIgPC0gbHNtLmR1bi5EUy5tYXN0ZXIgJT4lCiAgbXV0YXRlKCJCQ1ctSUQiID0gcGFzdGUwKCJCQ1ctIiwgSXNvbGF0ZSkpICU+JQogIG11dGF0ZSgiUmVzcG9uc2UiID0gIkRyeSBTaG9vdCIpCgojIFdldCBSb290cwojIyBFeHRyYWN0IElzb2xhdGUgSUQgZnJvbSBjb250cmFzdCB2YXJpYWJsZQpsc20uZHVuLldSLm1hc3RlciA8LSBsc20uZHVuLldSLm1hc3RlciAlPiUgCiAgZXh0cmFjdChjb250cmFzdCwgaW50byA9ICJJc29sYXRlIiwgcmVnZXggPSAiKF5bMC05XSspIiwgcmVtb3ZlID0gRkFMU0UpCgojIyBDcmVhdGUgQkNXLUlEIHZhcmlhYmxlCmxzbS5kdW4uV1IubWFzdGVyIDwtIGxzbS5kdW4uV1IubWFzdGVyICU+JQogIG11dGF0ZSgiQkNXLUlEIiA9IHBhc3RlMCgiQkNXLSIsIElzb2xhdGUpKSAlPiUKICBtdXRhdGUoIlJlc3BvbnNlIiA9ICJGcmVzaCBSb290IikKCiMgV2V0IFNob290cwojIyBFeHRyYWN0IElzb2xhdGUgSUQgZnJvbSBjb250cmFzdCB2YXJpYWJsZQpsc20uZHVuLldTLm1hc3RlciA8LSBsc20uZHVuLldTLm1hc3RlciAlPiUgCiAgZXh0cmFjdChjb250cmFzdCwgaW50byA9ICJJc29sYXRlIiwgcmVnZXggPSAiKF5bMC05XSspIiwgcmVtb3ZlID0gRkFMU0UpCgojIyBDcmVhdGUgQkNXLUlEIHZhcmlhYmxlCmxzbS5kdW4uV1MubWFzdGVyIDwtIGxzbS5kdW4uV1MubWFzdGVyICU+JQogIG11dGF0ZSgiQkNXLUlEIiA9IHBhc3RlMCgiQkNXLSIsIElzb2xhdGUpKSAlPiUKICBtdXRhdGUoIlJlc3BvbnNlIiA9ICJGcmVzaCBTaG9vdCIpCmBgYAoKIyBBZGQgUGVyY2VudCBDb250cm9sIFZhcmlhYmxlCmBgYHtyfQojIERyeSBSb290CmxzbS5kdW4uRFIubWFzdGVyJHBfY29udHJvbCA8LSBkcnlfcm9vdF9tYXN0ZXIkcF9jdHJsW21hdGNoKGxzbS5kdW4uRFIubWFzdGVyJElzb2xhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyeV9yb290X21hc3RlciRpc29sYXRlKV0KIyBEcnkgU2hvb3QKbHNtLmR1bi5EUy5tYXN0ZXIkcF9jb250cm9sIDwtIGRyeV9zaG9vdF9tYXN0ZXIkcF9jdHJsW21hdGNoKGxzbS5kdW4uRFMubWFzdGVyJElzb2xhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyeV9zaG9vdF9tYXN0ZXIkaXNvbGF0ZSldCiMgV2V0IFJvb3QKbHNtLmR1bi5XUi5tYXN0ZXIkcF9jb250cm9sIDwtIHdldF9yb290X21hc3RlciRwX2N0cmxbbWF0Y2gobHNtLmR1bi5XUi5tYXN0ZXIkSXNvbGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2V0X3Jvb3RfbWFzdGVyJGlzb2xhdGUpXQojIFdldCBTaG9vdApsc20uZHVuLldTLm1hc3RlciRwX2NvbnRyb2wgPC0gd2V0X3Nob290X21hc3RlciRwX2N0cmxbbWF0Y2gobHNtLmR1bi5XUy5tYXN0ZXIkSXNvbGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2V0X3Nob290X21hc3RlciRpc29sYXRlKV0KYGBgCgojIFNlbGVjdCB2YXJpYWJsZXMgYW5kIGZpbHRlcgpgYGB7cn0KIyBXZXQgU2hvb3QKdDIuV1MubWFzdGVyIDwtIGxzbS5kdW4uV1MubWFzdGVyICU+JQogIHNlbGVjdChgQkNXLUlEYCwgZXN0aW1hdGUsIFNFLCBwLnZhbHVlLCBSZXNwb25zZSwgcF9jb250cm9sKSAlPiUKICBmaWx0ZXIocF9jb250cm9sID4gMTAwICYKICAgICAgICAgICBwLnZhbHVlIDwgMC4xICYKICAgICAgICAgICBlc3RpbWF0ZSA+IDApCgojIFdldCBSb290CnQyLldSLm1hc3RlciA8LSBsc20uZHVuLldSLm1hc3RlciAlPiUKICBzZWxlY3QoYEJDVy1JRGAsIGVzdGltYXRlLCBTRSwgcC52YWx1ZSwgUmVzcG9uc2UsIHBfY29udHJvbCkgJT4lCiAgZmlsdGVyKHBfY29udHJvbCA+IDEwMCAmCiAgICAgICAgICAgcC52YWx1ZSA8IDAuMSAmCiAgICAgICAgICAgZXN0aW1hdGUgPiAwKQoKIyBEcnkgU2hvb3QKdDIuRFMubWFzdGVyIDwtIGxzbS5kdW4uRFMubWFzdGVyICU+JQogIHNlbGVjdChgQkNXLUlEYCwgZXN0aW1hdGUsIFNFLCBwLnZhbHVlLCBSZXNwb25zZSwgcF9jb250cm9sKSAlPiUKICBmaWx0ZXIocF9jb250cm9sID4gMTAwICYKICAgICAgICAgICBwLnZhbHVlIDwgMC4xICYKICAgICAgICAgICBlc3RpbWF0ZSA+IDApCgojIERyeSBSb290CnQyLkRSLm1hc3RlciA8LSBsc20uZHVuLkRSLm1hc3RlciAlPiUKICBzZWxlY3QoYEJDVy1JRGAsIGVzdGltYXRlLCBTRSwgcC52YWx1ZSwgUmVzcG9uc2UsIHBfY29udHJvbCkgJT4lCiAgZmlsdGVyKHBfY29udHJvbCA+IDEwMCAmCiAgICAgICAgICAgcC52YWx1ZSA8IDAuMSAmCiAgICAgICAgICAgZXN0aW1hdGUgPiAwKQoKIyBDb21iaW5lCnQyX2xpc3RfbWFzdGVyIDwtIG1nZXQobHMocGF0dGVybiA9ICJ0Mi4qLm1hc3RlciIpKQoKdDIubWFzdGVyIDwtIGJpbmRfcm93cyh0Ml9saXN0X21hc3RlcikKYGBgCgojIyBBZGQgR2VudXMgaW5mbwpgYGB7cn0KIyByZWFkIGluIGFiYiB0byBiY3cgbWFwIGZpbGUKYWJiX2Jjd19sYWJlbHMgPC0gcmVhZF9jc3YoIi4vbWV0YWRhdGEvYWJiX2dlbm9tZV9iY3dfbGFiZWxzLmNzdiIsIGNvbF9uYW1lcyA9IFRSVUUpCmFiYl9iY3dfbGFiZWxzJEJDV19JRCA8LSBzdWIoIl8iLCAiLSIsIGFiYl9iY3dfbGFiZWxzJEJDV19JRCkKCiMgcmVhZCBpbiBzb3VybWFzaCBsY2EgZGF0YSBvZiB3aG9sZSBnZW5vbWUgc2lnbmF0dXJlcwpzb3VybWFzaF9sY2EgPC0gcmVhZF9jc3YoIi4vbWV0YWRhdGEvbGNhLWNsYXNzaWZ5LWFsbC1rMzEtZ3RkYjg5LmNzdiIsIGNvbF9uYW1lcyA9IFRSVUUpCgojIyBlbXB0eSBjZWxscyBhcmUgJ3VuYXNzaWduZWQnCnNvdXJtYXNoX2xjYSA8LSBzb3VybWFzaF9sY2EgJT4lCiAgcmVwbGFjZSguLCBpcy5uYSguKSwgIlVuYXNzaWduZWQiKQoKIyByZWFkIGluIHNvdXJtYXNoIGxjYSBvZiBnZW5vbWUgYmluIHNpZ25hdHVyZXMKI3NvdXJtYXNoX2xjYS5iaW5zIDwtIHJlYWRfY3N2KCIuL21ldGFkYXRhL3NtLWxjYS1tZXRhYmF0LWFsbC1rMzEuY3N2IikKIwojIyMgYWRkIGxlYWRpbmcgemVyb3MgdG8gQUJCX0lEcyB0aGF0IHJlcXVpcmUKI3NvdXJtYXNoX2xjYS5iaW5zJElzb2xhdGVbMTo5XSA8LSBwYXN0ZTAoIjAwIiwgc291cm1hc2hfbGNhLmJpbnMkSXNvbGF0ZVsxOjldKQojc291cm1hc2hfbGNhLmJpbnMkSXNvbGF0ZVsxMDo5Ml0gPC0gcGFzdGUwKCIwIiwgc291cm1hc2hfbGNhLmJpbnMkSXNvbGF0ZVsxMDo5Ml0pCiMKIyMjIGFkZCBCQ1cgSUQgdG8gYmluIGNsYXNzaWZpY2F0aW9uIHRhYmxlCiNzb3VybWFzaF9sY2EuYmlucyRgQkNXLUlEYCA8LSBhYmJfYmN3X2xhYmVscyRCQ1dfSURbbWF0Y2goc291cm1hc2hfbGNhLmJpbnMkSXNvbGF0ZSwgI2FiYl9iY3dfbGFiZWxzJEFCQl9JRCldCiMKIyMjIGFkZCAndW5hc3NpZ25lZCcgdG8gZ2VudXMgY29sdW1uCiNzb3VybWFzaF9sY2EuYmlucyRnZW51cyA8LSBzb3VybWFzaF9sY2EuYmlucyRnZW51cyAlPiUgcmVwbGFjZV9uYSgidW5hc3NpZ25lZCIpCgojIEFkZCBHZW51cyB2YXJpYWJsZQp0Mi5tYXN0ZXIkR2VudXMgPC0gc291cm1hc2hfbGNhJGdlbnVzW21hdGNoKHQyLm1hc3RlciRgQkNXLUlEYCwgc291cm1hc2hfbGNhJElEKV0KCiMjIEZpbHRlciwgYWRqdXN0LCBzb3J0CnQyLm1hc3RlciA8LSB0Mi5tYXN0ZXIgJT4lCiAgZHJvcF9uYSgpICU+JSAjIHJlbW92ZSBOQXMgZm9yIHRheG9ub215IC0gdGhlc2UgYXJlIGV1a2FyeW90ZXMuCiAgbXV0YXRlKEdlbnVzID0gcmVwbGFjZShHZW51cywgc3RyX2RldGVjdChHZW51cywgIlVuYXNzaWduZWQiKSwgIkVudGVyb2JhY3RlciIpKSAlPiUgIyBhZGp1c3QgdGF4b25vbXkgYmFzZWQgb24gR2VuYmFuayBjbGFzc2lmaWNhdGlvbgogIHNlbGVjdCggR2VudXMsIGBCQ1ctSURgLCBSZXNwb25zZSwgZXN0aW1hdGUsIFNFLCBwLnZhbHVlLCBwX2NvbnRyb2wpICU+JQogIGFycmFuZ2UoR2VudXMsIGBCQ1ctSURgKQoKIyMgc2lnZmlncwojIyMgcC12YWx1ZQp0Mi5tYXN0ZXIgPC0gdDIubWFzdGVyICU+JSAKICBtdXRhdGVfYXQoLiwgYygicC52YWx1ZSIpLCByb3VuZCwgZGlnaXRzID0gNikgJT4lCiAgbXV0YXRlX2F0KC4sIGMoInAudmFsdWUiKSwgZm9ybWF0QywgZm9ybWF0ID0gImUiLCBkaWdpdHMgPSAyKQoKIyMjIHJlc3BvbnNlIHZhcmlhYmxlcwp0Mi5tYXN0ZXIgPC0gdDIubWFzdGVyICU+JQogIG11dGF0ZV9hdCguLCBjKCJlc3RpbWF0ZSIsICJTRSIsICJwX2NvbnRyb2wiKSwgcm91bmQsIGRpZ2l0cyA9IDIpCgojIHdyaXRlIHRvIGNzdgp3cml0ZV9jc3YodDIubWFzdGVyLCAiLi90YWJsZXMvTVMyLXRhYmxlXzIuY3N2IiwgY29sX25hbWVzID0gVFJVRSkKYGBgCgpgYGB7cn0KdDIubWFzdGVyLjIgPC0gdDIubWFzdGVyCgojIEFkZCBHZW51cyB2YXJpYWJsZQp0Mi5tYXN0ZXIuMiA8LSB0Mi5tYXN0ZXIuMiAlPiUKICBmdWxsX2pvaW4oc291cm1hc2hfbGNhLCBieSA9IGMoIkJDVy1JRCIgPSAiSUQiKSkgJT4lCiAgZHJvcF9uYSgpCmBgYAoK